Kotlin實戰【五】Kotlin中的異常

南方吳彥祖_藍斯發表於2021-11-09

一、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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章