1、空值处理
fun main() {
/**-------------------- 非空类型 --------------------*/
val str: String = "kotlin"
//val str1: String = null //编译报错,非空类型不能赋值为 null
/**-------------------- ? 可空类型 --------------------*/
val str2: String? = null //String? 可空字符串可以赋值为 null
//1、可空类型使用 . 调用可能会报空指针,不能通过编译
//str2.toInt()
//2、!! 强制编译器不检查,但还是可能会报空指针,不推荐使用
//str2!!.toInt()
//3、?. 空安全调用符,不为空才调用,为空则不调用
str2?.toInt()
//4、?: Elvis 操作符,str2 不为空则返回 toInt() 的值,为空则返回后面的 -1
val str3 = str2?.toInt() ?: -1
println(str3)
}
2、编译异常处理
/**
* 1、关于编译时异常 java 必须手动处理(try-catch 或者 throws);
* 而 kotlin 不检查编译时异常,因为它认为大多数情况下都不会出现编译时异常。
*
* 2、例如下面的 FileReader 会抛出 FileNotFoundException;
* 但是大多数情况下我们都会先判断文件是否存在,然后才会执行相应的操作;
* 所以绝大多数情况下并不会出现 FileNotFoundException;
* 因此 kotlin 就认为没有必要去检查编译时异常,增加无用代码。
*
* 3、关于 kotlin 的这种看法,有好有坏吧。
* 编译时异常可能会出现也可能不出现,是一个取舍的问题,就不深究了。
*/
fun main() {
val file = File("a.txt")
//if (!file.exists()) return //这里不判断文件是否存在,后面的 FileReader 也不会产生编译时异常
val br = BufferedReader(FileReader(file))
}
3、运行时异常
/**
* kotlin 处理运行时异常同 java 一样,采用 try-catch-finally
*/
fun main() {
try {
val a = 1 / 0
println("a = $a")
} catch (e: ArithmeticException) {
e.printStackTrace()
println(e.message)
} finally {
println("一定会执行的!")
}
}
网友评论