Kotlin基礎九'try', 'catch', 'finally'

Kotlin基礎九’try’, ‘catch’, ‘finally’


‘try-catch-finally’

  和Java一樣,你可以使用try-catch-finally去捕獲和處理異常,接下來的例子中你可以看到它是如何工作的:

fun readNumber(reader: BufferedReader): Int? {//你不需要像Java那樣聲明這個函數會拋出什麼異常
    try {
        val line = reader.readLine()
        return Integer.parseInt(line)
    } catch (e: NumberFormatException) {
        return null
    }
    finally {//和Java的finally一樣
        reader.close()
    }
}

fun main(args: Array<String>) {
    val reader = BufferedReader(StringReader("1234"))
    println(readNumber(reader))
}
//result
1234

Process finished with exit code 0

  這段代碼和Java最大的不同就是在Java中,你必須在函數後聲明你的函數會拋出什麼已檢查的類型異常,比如這裏你得在你的函數聲明後面聲明你的函數會拋出IOException。在Kotlin中,這是不必要的。
  Kotlin和其他現代的JVM語言一樣,並不區分已檢查異常未檢查異常,你不需要指出你的函數或者方法可以拋出什麼異常。
  這樣的設計是基於Java的大量用例,經驗表明,Java的規則通常需要很多無意義的代碼來重新拋出或者忽略異常,這種規則並不能始終保護你可以免受發生錯誤的影響。
  比如說,像上面寫的代碼,NumberFormatException不是一個已檢查異常,因此,Java編譯器不強制要求你捕獲它,但是你可以很輕易地看到它會在運行時發生錯誤,一些不合法的數據輸入所導致它的發生。與此同時,BufferedReader.cose()方法可以拋出一個IOException,它是個已檢查異常,需要被捕獲處理。但是很多的程序在關閉失敗時也並不能做出什麼有效的處理。

‘try’作爲一個表達式

  讓我們來看看和Java相比另一個比較有意思的不同:

fun readNumber(reader: BufferedReader) {
    val number = try {
        Integer.parseInt(reader.readLine())
    } catch (e: NumberFormatException) {
        return
    }
    println(number)
}

fun main(args: Array<String>) {
    readNumber(BufferedReader(StringReader("1234")))
    readNumber(BufferedReader(StringReader("not a num")))
}
//result:
1234

Process finished with exit code 0

  可以看到,只有一行輸出,第二個函數調用並沒有執行到打印語句。在這裏try作爲了一個帶有值的表達式,如果字符串解析成功,返回解析後的數字,否則進入catch直接返回函數被調用的地方。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章