Kotlin语言(八):异常处理

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("一定会执行的!")
    }
}

你可能感兴趣的:(Kotlin语言(八):异常处理)