Kotlin實戰【五】Kotlin中的異常
一、kotlin如何拋異常
Kotlin中的異常處理與Java或者其他語言中的處理方式相似。一個函式可以以正常方式結束,或者當錯誤發生的時候丟擲異常。函式呼叫者捕獲這個異常並處理它;如果沒有,異常重新在呼叫棧向上拋。
Kotlin中的異常處理語句的基本形式和Java是相似的: java中:
if ( <= percentage <= 100 ){ throw new IllegalArgumentException( "A percentage value must be between 0 and 100: $percentage" ) ; }
kotlin中:(和java的區別,不必使用new來建立例項)
if (percentage ! in 0..100) { throw IllegalArgumentException( "A percentage value must be between 0 and 100: $percentage " ) }
不光如此,kotlin中的throw結構是一個表示式,能作為另一個表示式的一部分使用:
val percentage = if (number in 0. .100 ) number else throw IllegalArgumentException( //“throw” 是一個表示式 "A percentage value must be between 0 and 100: $number" )
這個例子中,如果滿足條件,程式的行為正確,percentage會number初始化,否則異常將被丟擲,而變數也不會初始化。
二、“try”、“catch”、“finally”
就像Java之中,可以用try結構,和catch和finally子句處理異常。
如下,讀取指定檔案的一行,嘗試解析為數字,然後返回一個數字,如果這行不是有效的數字,返回null。
fun readNumber (reader: BufferedReader) : Int? { //不必顯式地指定這個函式可能丟擲的異常 try { val line = reader.readLine() return Integer.parseInt(line) } catch (e: NumberFormatException) { //異常的型別在右邊 return null } finally { //finally就像在Java一樣的 reader.close() } } val reader = BufferedReader(StringReader( "239" )) println(readNumber(reader)) //239
java中:
public int readNumber (BufferedReader reader) throws IOException { //顯式地指定這個函式可能丟擲的異常 try { String line = reader.readLine() return Integer.parseInt(line) } catch (NumberFormatException e) { return null } finally { reader.close() } }
從對比中我們可以看出kotlin和Java最大的不同是不需要throws子句。在java中,這種異常必須顯示的處理,必須宣告你的函式可能丟擲的所有受檢異常。 如果呼叫另一個函式,需要處理這個函式的受檢異常,或者宣告你的函式可能丟擲的這些異常。
和其他現代JVM語言,Koltin不區別受檢查和不受檢查的異常。你需要指定一個函式丟擲的異常,你可以也可以不處理這些異常。這個設計決定是基於Java中使用受檢查異常的實踐。經驗表明,Java規則常常需要很多無意義的程式碼從新丟擲或者忽略異常,而且這些規則不能總是保護你免受坑你發生的錯誤。
在上面的例子中,NumberFormatException是一個不受檢查的異常。所以Java編譯器不會強迫你捕獲這個異常,你可以很容易的看見執行時的異常。這相當令人遺憾,因為不有效的輸入資料是經常的事情,應該更優雅的處理。同時,BufferedReader.close方法也能丟擲一個IOException異常,這是個需要處理的受檢查的異常。如果關閉一個流失敗了,大部分程式碼不能採取任何有意義的行動,所以需要從close方法捕獲異常的程式碼基本是樣板程式碼。
三、try作為一個表示式
為了顯示Java和Kotlin直接一個重要區別,讓我們稍微改變下這個例子。移除fianlly部分(因為你已經知道這個怎麼工作),然後加一些程式碼列印從這個檔案讀取的數字。
fun readNumber (reader: BufferedReader) { val number = try { Integer.parseInt(reader.readLine()) //成為try表示式的值 } catch (e: NumberFormatException) { return } println(number) } val reader = BufferedReader(StringReader( "not a number" )) readNumber(reader) //沒有列印任何數字
Kotlin中try關鍵詞,就像if和when,引進了一個表示式,你可以把它的值賦值給一個變數。不像if,你一直需要把語句保函在花括號中。就像其他語句,如果包涵多個表示式,try表示式的值是最後一個表示式的值。在這個例子中,在catch程式碼塊中有return語句,所以這個函式在catch程式碼塊後不會再進行。如果你想繼續這個執行,catch語句也需要一個值,這個值是最後表示式的值:
fun readNumber (reader: BufferedReader) { val number = try { Integer.parseInt(reader.readLine()) //沒有異常發生時使用這個值 } catch (e: NumberFormatException) { null //異常發生時使用null值 } println(number) } val reader = BufferedReader(StringReader( "not a number" )) readNumber(reader) //異常被丟擲,所以函式列印null //null
如果一個try程式碼塊執行一切正常,程式碼塊中最後一個表示式就是結果。如果捕獲到一個異常,那麼cache程式碼塊中最後一個表示式就是結果。
四、總結
- 1、kotlin中的異常處理和java處理相似,除了Kotlin不要求你宣告函式可以丟擲的異常。
- 2、如果一個try程式碼塊執行一切正常,程式碼塊中最後一個表示式就是結果。
- 3、如果捕獲到一個異常,那麼cache程式碼塊中最後一個表示式就是結果。
本文轉自 https://cloud.tencent.com/developer/article/1397852,如有侵權,請聯絡刪除。
相關影片:
Android進階學習:Kotlin核心技術_嗶哩嗶哩_bilibili
Android網路架構搭建與原理解析(一)——透過一個網路請求一步一步見證網路模組的成長_嗶哩嗶哩_bilibili
【Android進階課程】——colin Compose的繪製原理講解(一)_嗶哩嗶哩_bilibili
【 Android進階教程】——Framework面試必問的Handler原始碼解析_嗶哩嗶哩_bilibili
【 Android進階教程】——熱修復原理解析_嗶哩嗶哩_bilibili
【 Android進階教程】——如何解決OOM問題與LeakCanary原理解析_嗶哩嗶哩_bilibili
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983917/viewspace-2841419/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kotlin 異常Kotlin
- Android版kotlin協程入門(三):kotlin協程的異常處理AndroidKotlin
- 用Kotlin的方式來處理網路異常Kotlin
- Kotlin藝術探索之引數和異常Kotlin
- Android Studio: Kotlin使用DataBinding異常AndroidKotlin
- Kotlin 實戰指南 | 如何在大型應用中新增 KotlinKotlin
- Kotlin實戰--Retrofit網路模型Kotlin模型
- 用Kotlin-koans學Kotlin【五】 iv_propertiesKotlin
- kotlin學習筆記-異常好玩的list集合總結Kotlin筆記
- Kotlin 和 JetPack 的專案實戰(一)KotlinJetpack
- 從Java到Kotlin(五)JavaKotlin
- Kotlin教程(五)型別Kotlin型別
- Kotlin中的反射Kotlin反射
- Kotlin中的IOKotlin
- Kotlin實戰【四】迭代事物:while和forKotlinWhile
- Kotlin實戰【三】表示與選擇Kotlin
- Kotlin DSL C++專案引入OpenCV異常處理(轉)KotlinC++OpenCV
- Android版kotlin協程入門(四):kotlin協程開發實戰AndroidKotlin
- Kotlin中的泛型Kotlin泛型
- Kotlin 實踐Kotlin
- Kotlin基礎:白話文轉文言文般的Kotlin常識Kotlin
- Kotlin知識歸納(五) —— LambdaKotlin
- Kotlin中的crossinlineKotlinROSinline
- 【Kotlin】初識Kotlin(二)Kotlin
- Dive Into Kotlin(一):初探 KotlinKotlin
- 【Kotlin】Kotlin環境搭建Kotlin
- 實戰 | 使用 Kotlin Flow 構建資料流 "管道"Kotlin
- Kotlin 入門開發__安卓小專案實戰Kotlin安卓
- Kotlin-48.JavaScript呼叫Kotlin(Call Kotlin from JavaScript)KotlinJavaScript
- 淺談Kotlin中的函式Kotlin函式
- Kotlin 泛型中的 in 和 outKotlin泛型
- 理解 Kotlin 中的屬性(property)Kotlin
- Kotlin 中的迴圈全解Kotlin
- Kotlin中的高階函式Kotlin函式
- 常見Kotlin高頻問題解惑Kotlin
- Kotlin刨根問底(一):你真的瞭解Kotlin中的空安全嗎?Kotlin
- Kotlin 知識梳理(6) Kotlin 的可空性Kotlin
- Kotlin的互操作——Kotlin與Java互相呼叫KotlinJava