Kotlin try...catch塊
Kotlin try-catch
塊用於代碼中的異常處理。 try
塊包含可能拋出異常的代碼,catch
塊用於處理異常,必須在方法中寫入此塊。 Kotlin try
塊必須跟隨catch
塊或finally
塊或兩者。
使用catch塊的try語法
try{
//code that may throw exception
}catch(e: SomeException){
//code that handles exception
}
使用finally塊的try語法
try{
//code that may throw exception
}finally{
// code finally block
}
try catch語法與finally塊
try {
// some code
}
catch (e: SomeException) {
// handler
}
finally {
// optional finally block
}
沒有異常處理的問題
下面來看看一個未處理的異常的例子。
fun main(args: Array<String>){
val data = 20 / 0 //may throw exception
println("code below exception ...")
}
上面的程序生成一個異常,導致低於的異常代碼的其餘部分不可執行。
執行上面示例代碼,得到以下結果 -
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ExceptionHandlingKt.main(ExceptionHandling.kt:2)
異常處理解決方案
通過使用try-catch
塊來看到上述問題的解決方案。
fun main(args: Array<String>){
try {
val data = 20 / 0 //may throw exception
} catch (e: ArithmeticException) {
println(e)
}
println("code below exception...")
}
執行上面示例代碼,得到以下結果 -
java.lang.ArithmeticException: / by zero
code below exception...
在實現try-catch
塊之後的上述程序中,執行異常下面的其餘代碼。
Kotlin try塊作爲表達式
使用try
塊作爲返回值的表達式。 try
表達式返回的值是try
塊的最後一個表達式或catch
的最後一個表達式。 finally
塊的內容不會影響表達式的結果。
Kotlin try作爲表達的示例
下面來看一下try-catch
塊作爲返回值的表達式的示例。 在此示例中,Int
的字符串值不會生成任何異常並返回try
塊的最後一個語句。
fun main(args: Array<String>){
val str = getNumber("10")
println(str)
}
fun getNumber(str: String): Int{
return try {
Integer.parseInt(str)
} catch (e: ArithmeticException) {
0
}
}
執行上面示例代碼,得到以下結果 -
10
修改上面生成異常的代碼並返回catch
塊的最後一個語句。
fun main(args: Array<String>){
val str = getNumber("10.5")
println(str)
}
fun getNumber(str: String): Int{
return try {
Integer.parseInt(str)
} catch (e: NumberFormatException) {
0
}
}
執行上面示例代碼,得到以下結果 -
0
Kotlin多個catch塊示例1
下面我們來看一個擁有多個catch
塊的例子。 在這個例子中,將執行不同類型的操作。 這些不同類型的操作可能會產生不同類型的異常。
fun main(args: Array<String>){
try {
val a = IntArray(5)
a[5] = 10 / 0
} catch (e: ArithmeticException) {
println("arithmetic exception catch")
} catch (e: ArrayIndexOutOfBoundsException) {
println("array index outofbounds exception")
} catch (e: Exception) {
println("parent exception class")
}
println("code after try catch...")
}
執行上面示例代碼,得到以下結果 -
arithmetic exception catch
code after try catch...
注意 :一次只發生一個異常,並且一次只執行一個
catch
塊。
規則: 所有catch
塊必須從最具體到一般放置,即ArithmeticException
的catch
必須在Exception
的catch
之前。
當從一般異常中捕獲到特定異常時會發生什麼?
它會產生警告。 例如:
修改上面的代碼並將catch
塊從一般異常放到特定異常中。
fun main(args: Array<String>){
try {
val a = IntArray(5)
a[5] = 10 / 0
}
catch (e: Exception) {
println("parent exception catch")
}
catch (e: ArithmeticException) {
println("arithmetic exception catch")
} catch (e: ArrayIndexOutOfBoundsException) {
println("array index outofbounds exception")
}
println("code after try catch...")
}
編譯時輸出
warning : division by zero
a[5] = 10/0
運行時輸出
parent exception catch
code after try catch...