Kotlin异常处理、空安全、类型检查与正则表达式
立即解锁
发布时间: 2025-08-19 00:41:33 阅读量: 1 订阅数: 2 


精通Kotlin:从入门到实践的全面指南
### Kotlin 异常处理、空安全、类型检查与正则表达式
#### 1. Kotlin 异常处理
在 Kotlin 中,异常处理是保障程序健壮性的重要部分。以下是几种常见的异常处理方式:
##### 1.1 throw 关键字
可以使用 `throw` 关键字显式抛出异常,也能抛出自定义异常。示例代码如下:
```kotlin
fun main(args: Array<String>) {
test("abcde")
println("executes after validation")
}
fun test(password: String) {
if (password.length < 6)
throw ArithmeticException("Password is short")
else
println("Password strong ")
}
```
上述代码中,`test` 函数会检查密码长度,如果小于 6 则抛出 `ArithmeticException` 异常。
##### 1.2 嵌套 try 块
嵌套 try 块是在一个 try-catch 块中嵌套另一个 try-catch 块。当内部 try-catch 块无法处理异常时,会由外部 try-catch 块处理。示例代码如下:
```kotlin
fun main(args: Array<String>) {
val numbers = arrayOf(11,22,33,44)
try {
for (i in numbers.indices) {
try {
var n = (0..4).random()
println(numbers[i+1]/n)
} catch (c: ArithmeticException) {
println(c)
}
}
} catch (c: ArrayIndexOutOfBoundsException) {
println(c)
}
}
```
该代码中,内层 try 块可能会抛出 `ArithmeticException` 异常,由内层 catch 块处理;如果出现 `ArrayIndexOutOfBoundsException` 异常,则由外层 catch 块处理。
##### 1.3 多个 catch 块
一个 try 块可以包含多个 catch 块,用于处理不同类型的异常。示例代码如下:
```kotlin
import java.util.Scanner
object Tests {
@JvmStatic
fun main(args: Array<String>) {
val scn = Scanner(System.`in`)
try {
val n = Integer.parseInt(scn.nextLine())
if (512 % n == 0)
println("$n is a factor of 512")
} catch (c: ArithmeticException) {
println(c)
} catch (c: NumberFormatException) {
println(c)
}
}
}
```
上述代码中,try 块可能会抛出 `ArithmeticException` 和 `NumberFormatException` 异常,分别由对应的 catch 块处理。
也可以使用 `when` 表达式替代多个 catch 块,示例代码如下:
```kotlin
import java.lang.NumberFormatException
import java.util.Scanner
object Tests {
@JvmStatic
fun main(args: Array<String>) {
val scn = Scanner(System.`in`)
try {
val n = Integer.parseInt(scn.nextLine())
if (512 % n == 0)
println("$n is a factor of 512")
} catch (c: Exception ) {
when(c){
is ArithmeticException -> { println("The Arithmetic Exception: Divide by zero") }
is NumberFormatException -> { println("The Number Format Exception ") }
}
}
}
}
```
#### 2. Kotlin 空安全
Kotlin 的类型系统旨在消除代码中 null 引用的风险,因为空指针异常(NullPointerException)可能导致应用程序或系统失败。
##### 2.1 可空和非可空类型
Kotlin 区分可空引用和非可空引用。非可空类型变量不能赋值为 null,否则会编译错误;可空类型变量可以赋值为 null。示例代码如下:
```kotlin
// 非可空类型
var st1: String = "Hub"
// st1 = null // 编译错误
// 可空类型
var st2: String? = "Huboftutors"
st2 = null // 正常
print(st2)
```
访问非可空类型变量的属性是安全的,而访问可空类型变量的属性需要额外处理,否则会编译错误。
##### 2.2 检查空值
可以使用 `if-else` 语句检查变量是否为 null,示例代码如下:
```kotlin
fun main(args: Array<String>) {
var st: String? = "Huboftutors"
println(st)
if (st != null) {
println("String of length ${st.length}")
} else {
println("Null string")
}
st = null
println(st)
if (st != null) {
println("String of length ${st.length}")
} else {
println("Null String")
}
}
```
##### 2.3 安全调用操作符(?.)
安全调用操作符 `?.` 可以简化空检查,只有当引用不为 null 时才执行操作。示例代码如下:
```kotlin
fun main(args: Array<String>) {
var firstname: String? = "Preesha"
var lastname: String? = null
println(firstname?.toUpperCase())
println(firstname?.length)
println(lastname?.toUpperCase())
}
```
还可以将安全调用操作符与 `let()`、`also()` 和 `run()` 结合使用。例如使用 `let()` 的示例代码:
```kotlin
fun main(args: Array<String>) {
var stringlist: List<String?> = listOf("Hub","of", null, "tutors")
var newlist = listOf<String?>()
for (item in stringlist) {
item?.let { newlist = newlist.plus(it) }
}
for(items in newlist){
println(items)
}
}
```
##### 2.4 Elvis 操作符(?:)
Elvis 操作符 `?:` 用于在变量为 null 时返回默认值。示例代码如下:
```kotlin
fun main(args: Array<String>) {
var st : String? = "Huboftutors"
println(st?.length)
st = null
println(st?.length?: "-1")
}
```
##### 2.5 非空断言操作符(!!)
非空断言操作符 `!!` 会将可空类型转换为非可空类型,如果值为 null 则抛出异常。示例代码如下:
```kotlin
fun main(args: Array<String>) {
var st : String? = "Huboftutors"
println(st!!.length)
st = null
st!!.length
}
```
#### 3. Kotlin 类型检查与智能转换
在 Kotlin 中,可以在运行时检查变量的类型,并进行智能转换。
##### 3.1 类型检查
使用 `is` 操作符在运行时确定变量的类型。示例代码如下:
```kotlin
fun main(args: Array<String>) {
var names = "Praniti"
var ages = 26
var salary = 5100.54
val employeeDetails: List<Any> = listOf(names,ages,salary)
for(attribute in employeeDetails) {
if (attribute is String) {
println("The Name is: $attribute")
} else if (attribute is Int) {
println("The Age is: $attribute")
} else if (attribute is Double) {
println("The Salary is: $attribute")
} else {
println("Not an attribute")
}
}
}
```
也可以使用 `when` 表达式替代 `if-else` 块,示例代码如下:
```kotlin
fun main(args: Array<String>) {
var names = "Pariniti"
var ages = 25
var salary = 5100.55
var emp_id = 13245f
val employeeDetails: List<Any> = listOf(names, ages, salary, emp_id)
for (attribute in employeeDetails) {
when (attribute) {
is String -> println("Name is: $attribute ")
is Int -> println("Age is: $attribute")
is Double -> println("Salary is: $attribute")
else -> println("Not an attribute")
```
0
0
复制全文
相关推荐










