kotlin-異常處理

異常是什么

異常就是有異于常態(tài)淆院,和正常情況不一樣箫攀,有錯(cuò)誤出現(xiàn)。

異常分類

異常分類.png

Error

是程序中無法處理的錯(cuò)誤树叽,表示運(yùn)行應(yīng)用程序中出現(xiàn)了嚴(yán)重的錯(cuò)誤。此類錯(cuò)誤一般表示代碼運(yùn)行時(shí)JVM出現(xiàn)問題谦絮。

代表異常:VirtualMachineError(虛擬機(jī)運(yùn)行錯(cuò)誤)题诵、NoClassDefFoundError(類定義錯(cuò)誤)、OutOfMemoryError层皱。

此類錯(cuò)誤發(fā)生時(shí)性锭,JVM將終止線程。非代碼性錯(cuò)誤叫胖。因此篷店,當(dāng)此類錯(cuò)誤發(fā)生時(shí),應(yīng)用不應(yīng)該去處理此類錯(cuò)誤臭家。

Exception

程序本身可以捕獲并且可以處理的異常。又分為不受檢異常方淤、受檢異常

  • 運(yùn)行時(shí)異常(不受檢異常):

RuntimeException類極其子類表示JVM在運(yùn)行期間可能出現(xiàn)的錯(cuò)誤钉赁。編譯器不會(huì)檢查此類異常,并且不要求處理異常携茂。

代表異常:NullPointerException)你踩、ArrayIndexOutBoundException。

此類異常屬于不可查異常讳苦,一般是由程序邏輯錯(cuò)誤引起的带膜,在程序中可以選擇捕獲處理,也可以不處理鸳谜。

  • 非運(yùn)行時(shí)異常(受檢異常):

Exception中除RuntimeException極其子類之外的異常膝藕。編譯器會(huì)檢查此類異常,如果程序中出現(xiàn)此類異常
代表異常:說IOException

必須對(duì)該異常進(jìn)行處理咐扭,要么使用try-catch捕獲芭挽,要么使用throws語句拋出,否則編譯不通過蝗肪。

異常的處理

拋出異常:throw袜爪,throws

throw

throw用在方法內(nèi),用來拋出一個(gè)異常對(duì)象薛闪,將這個(gè)異常對(duì)象傳遞到調(diào)用者處辛馆,并結(jié) 束當(dāng)前方法的執(zhí)行。

public class DemoThrow {
    public static void main(String[] args) {
      int a =   DemoThrow.div(4,0);
      System.out.println(a);
    }
 
   public static int div(int a,int b)
      {
            if(b==0)
              throw new ArithmeticException("異常信息:除數(shù)不能為0");//拋出具體問題豁延,編譯時(shí)不檢測(cè)
            return a/b;
     }
}
e1.png

throws

運(yùn)用于方法聲明之上昙篙,用于表示當(dāng)前方法不處理異常腊状,而是提醒該方法的調(diào)用者來處理異常

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
 
public class DemoThrows {
 
 
    public static void main(String[] args) throws FileNotFoundException{
        readFile();
    }
 
    public static  void readFile() throws FileNotFoundException {
        InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
    }
}
e2.png

try代碼塊

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
 
public class DemoTryCatch {
 
    public static void main(String[] args) {
        //捕獲異常
        try {
            //可能產(chǎn)生異常的代碼
            readFile();
        } catch (FileNotFoundException e) {
            //異常的處理邏輯,將異常記錄日志瓢对,異常封裝后顯示
          System.out.println("系統(tǒng)找不到指定的路徑");
        }
        System.out.println("后續(xù)代碼");
 
    }
    public static  void readFile() throws FileNotFoundException {
        InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
    }
}
e3.png

kotlin異常處理

Kotlin 中所有異常類都是 Throwable 類的子類寿酌。

throw

fun main() {
//sampleStart
    throw Exception("Hi There!")
//sampleEnd
}

try

try {
    // 一些代碼
}
catch (e: SomeException) {
    // 處理程序
}
finally {
    // 可選的 finally 塊
}

try表達(dá)式

fun e3(){
    val result = try {
        throw IllegalArgumentException("exception happen")
    }catch (e:Throwable){
        println(e.message)
        0   //返回最后一行
    }finally {
        123 //不會(huì)作為返回值,只會(huì)返回try硕蛹、catch最后一行
    }
    println(result)
}

try-表達(dá)式的返回值是 try 塊中的最后一個(gè)表達(dá)式或者是(所有)catch 塊中的最后一個(gè)表達(dá)式醇疼。 finally 塊中的內(nèi)容不會(huì)影響表達(dá)式的結(jié)果。

受檢的異常

Kotlin 沒有受檢的異常法焰⊙砭#可以理解都是運(yùn)行時(shí)異常。同理AS不會(huì)提醒你要捕捉異常埃仪。

Java

try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

kotlin

Thread.sleep(3000)

經(jīng)過了解知道乙濒,不僅僅Thread.sleep不需要獲取異常,像對(duì)文件操作一般需要捕獲的IOException也不需要了卵蛉;

原來kotlin在編譯時(shí)根本不會(huì)檢查你有沒有捕獲異常颁股!
看到這里我也是有點(diǎn)擔(dān)心的,不捕獲異常萬一在運(yùn)行時(shí)拋出異常程序不就崩了嗎傻丝?

其實(shí)很多異常我們是可以預(yù)估到它可能會(huì)發(fā)生并且避免的甘有,比如Thread.sleep的InterruptedException,只有在調(diào)用thrad.interrupt()方法后才會(huì)拋出葡缰,正常情況下并不會(huì)拋出該異常亏掀,但是在java中編譯器卻強(qiáng)制我們要捕獲,讓代碼看起來就很臃腫不夠簡(jiǎn)潔泛释;

而且 java強(qiáng)制要求捕獲異常并沒有降低異常的發(fā)生滤愕,有很多更常見的異常并沒有強(qiáng)制要求捕獲,例如:NullPointerException怜校、ArrayIndexOutOfBoundsException间影、IllegalArgumentException等

kotlin并不是告訴你不要再捕捉異常!對(duì)待異常韭畸,我們還是要養(yǎng)成良好的編碼習(xí)慣宇智,考慮周全一些,在可能拋出異常的地方通過if判斷等方式將其扼殺在搖籃里胰丁;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末随橘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锦庸,更是在濱河造成了極大的恐慌机蔗,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異萝嘁,居然都是意外死亡梆掸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門牙言,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酸钦,“玉大人,你說我怎么就攤上這事咱枉”傲颍” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蚕断,是天一觀的道長(zhǎng)欢伏。 經(jīng)常有香客問我,道長(zhǎng)亿乳,這世上最難降的妖魔是什么硝拧? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮葛假,結(jié)果婚禮上障陶,老公的妹妹穿的比我還像新娘。我一直安慰自己聊训,他們只是感情好咸这,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著魔眨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酿雪。 梳的紋絲不亂的頭發(fā)上遏暴,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音指黎,去河邊找鬼朋凉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛醋安,可吹牛的內(nèi)容都是我干的杂彭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吓揪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼亲怠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柠辞,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤团秽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體习勤,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踪栋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了图毕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夷都。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖予颤,靈堂內(nèi)的尸體忽然破棺而出囤官,到底是詐尸還是另有隱情,我是刑警寧澤荣瑟,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布治拿,位于F島的核電站,受9級(jí)特大地震影響笆焰,放射性物質(zhì)發(fā)生泄漏劫谅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一嚷掠、第九天 我趴在偏房一處隱蔽的房頂上張望捏检。 院中可真熱鬧,春花似錦不皆、人聲如沸贯城。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)能犯。三九已至,卻和暖如春犬耻,著一層夾襖步出監(jiān)牢的瞬間踩晶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工枕磁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渡蜻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓计济,卻偏偏與公主長(zhǎng)得像茸苇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沦寂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 歡迎前往我的csdn kotlin 異常處理機(jī)制類似 Java 異常處理機(jī)制学密。但有一點(diǎn)不同,Java 中的異常分為...
    AlfredZSGao閱讀 137評(píng)論 0 1
  • Throwable 類Error 和 Exception ??Kotlin中的異常有3種传藏,Exception则果、Er...
    狼性代碼人閱讀 4,387評(píng)論 0 3
  • 異常在學(xué)習(xí)與開發(fā)當(dāng)中是最常見的幔翰,Kotlin的異常處理和Java以及其他開發(fā)語言的處理方式很相似。一個(gè)函數(shù)可以正常...
    阿博聊編程閱讀 1,412評(píng)論 0 1
  • try-catch 語句try-catch 表達(dá)式多 catch 代碼塊try-catch 語句嵌套 一西壮、try-...
    狼性代碼人閱讀 4,290評(píng)論 0 2
  • 來源:https://www.cnblogs.com/Qian123/p/5715402.html#_label0...
    Alex筆記閱讀 377評(píng)論 0 1