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
塊之後的上述程式中,執行異常下面的其餘程式碼。
使用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...