Kotlin 基礎教程之異常
Kotlin 基礎教程之異常
概述
在Kotlin-null的處理里提到的NPE,它就是一個異常。而,異常是程序運行過程中出現的錯誤。在Kotlin中,所有的異常都繼承于Throwable。對于每一個異常而言,它不僅僅包括異常的信息,還可以選擇性包括異常的原因,而其原因也是一個異常的實例。
拋出異常
使用 throw表達式拋出異常:
throw MyException("Hi There!")
捕獲異常
如果在函數內部拋出了異常(或者在函數內部調用的其他函數拋出了異常),這個函數將在拋出異常的地方結束。如果不希望函數結束,此時就必須捕獲這個被拋出的異常并處理這個異常。
在Kotlin中,要捕獲異常, 可以使用 try 表達式:
try {
// 某些代碼
}
catch (e: SomeException) {
// 異常處理
}
finally {
// 可選的 finally 代碼段
}
- try語句塊:表示要嘗試運行代碼,try語句塊中代碼受異常監(jiān)控,其中代碼發(fā)生異常時,會拋出異常對象。
- catch語句塊:會捕獲try代碼塊中發(fā)生的異常并在其代碼塊中做異常處理,catch語句帶一個Throwable類型的參數,表示可捕獲異常類型。當try中出現異常時,catch會捕獲到發(fā)生的異常,并和自己的異常類型匹配, 若匹配,則執(zhí)行catch塊中代碼,并將catch塊參數指向所拋的異常對象。catch語句可以有多個, 用來匹配多個中的一個異常,一旦匹上配后,就不再嘗試匹配別的catch塊了。 通過異常對象可以獲取異常發(fā)生時完整的JVM堆棧信息,以及異常信息和異常發(fā)生的原因等。
- finally語句塊:緊跟catch語句后的語句塊,這個語句塊總是會在方法返回前執(zhí)行,而不管是否try語句塊是否發(fā)生異常。并且這個語句塊總是在方法返回前執(zhí)行。 目的是給程序一個補救的機會。這樣做也體現了Java語言的健壯性。
注:
- try、catch、finally三個語句塊均不能單獨使用,三者可以組成 try…catch…finally、try…catch、try…finally三種結構,catch語句可以有一個或多個,finally語句最多一個。
- try、catch、finally三個代碼塊中變量的作用域為代碼塊內部,分別獨立而不能相互訪問。如果要在三個塊中都可以訪問,則需要將變量定義到這些塊的外面。
- 多個catch塊時候,只會匹配其中一個異常類并執(zhí)行catch塊代碼,而不會再執(zhí)行別的catch塊,并且匹配catch語句的順序是由上到下。
- try表達式中可以有0個或多個catch代碼段. finally 代碼段可以省略. 但是,catch或 finally代碼段至少要出現一個與try配對出現。
自定義異常
在Kotlin標準庫中封裝的異常類型,不可能會預見所有的可能碰見的異常情況,此時自己定義異常,來表示程序中可能出現的特定問題。
如果想自定義異常,就必須繼承現有的異常類,一般都繼承其異常情況相似的類,建立異常類型最簡單的方法就是使用編輯器產生默認的構造方法,這樣簡單而有效。
fun main(args: Array<String>) {
var b: String? = null
try {
b?.length ?: throw MyExcepttion("b不能為空")
} catch (ex: MyExcepttion) {
println("ex: ${ex.message}")
} catch (npe: NullPointerException) {
println("npe: ${npe.message}")
} finally {
println("finally")
}
}
public class MyExcepttion(override val message: String) : Throwable(){
}
// Log
ex: b不能為空
finally
try表達式
在Kotlin中try是一個表達式, 也就是說, 它可以有返回值.
val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }
try表達式的返回值, 要么是try代碼段內最后一個表達式的值,要么是 catch代碼段內最后一個表達式的值. finally代碼段的內容不會影響 try 表達式的結果值.
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
@Valid注解的作用及@Valid注解與@Validated的區(qū)別
這篇文章主要介紹了@Valid注解的作用及@Valid注解與@Validated的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
IDEA設置maven修改settings.xml配置文件無法加載倉庫的解決方案
這篇文章主要介紹了IDEA設置maven修改settings.xml配置文件無法加載倉庫的解決方案,幫助大家更好的利用IDEA進行JAVA的開發(fā)學習,感興趣的朋友可以了解下2021-01-01
SpringBoot自定義MessageConverter與內容協商管理器contentNegotiationManag
這篇文章主要介紹了SpringBoot自定義MessageConverter與內容協商管理器contentNegotiationManager的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-10-10
Java concurrency線程池之線程池原理(四)_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Java concurrency線程池之線程池原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06

