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塊必須從最具體到一般放置,即ArithmeticExceptioncatch必須在Exceptioncatch之前。

當從一般異常中捕獲到特定異常時會發生什麼?

它會產生警告。 例如:
修改上面的程式碼並將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...