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
直接返回函數被調用的地方。