一、異常的分類
Throwable是所有異常的根,java.lang.Throwable
Error是錯(cuò)誤,java.lang.Error;無法處理,線程死了,服務(wù)器宕機(jī),服務(wù)器崩潰
Exception是異常,java.lang.Exception;可以想辦法處理
二、Exception
一般分為Checked異常和Runtime異常,所有RuntimeException類及其子類的實(shí)例被稱為Runtime異常,不屬于該范疇的異常則被稱為CheckedException。
①Checked異常(編譯時(shí)異常)
只有java語言提供了Checked異常,Java認(rèn)為Checked異常都是可以被處理的異常,所以Java程序必須顯示處理Checked異常。如果程序沒有處理Checked異常,該程序在編譯時(shí)就會(huì)發(fā)生錯(cuò)誤無法編譯。這體現(xiàn)了Java的設(shè)計(jì)哲學(xué):沒有完善錯(cuò)誤處理的代碼根本沒有機(jī)會(huì)被執(zhí)行。對Checked異常處理方法有兩種
1 當(dāng)前方法知道如何處理該異常,則用try...catch塊來處理該異常。
2 當(dāng)前方法不知道如何處理,則在定義該方法是聲明拋出該異常。
我們比較熟悉的Checked異常有
Java.lang.ClassNotFoundException
Java.lang.NoSuchMetodException
java.io.IOException
②RuntimeException(運(yùn)行時(shí)異常)
Runtime如除數(shù)是0和數(shù)組下標(biāo)越界等,其產(chǎn)生頻繁,處理麻煩,若顯示申明或者捕獲將會(huì)對程序的可讀性和運(yùn)行效率影響很大。所以由系統(tǒng)自動(dòng)檢測并將它們交給缺省的異常處理程序。當(dāng)然如果你有處理要求也可以顯示捕獲它們。
我們比較熟悉的RumtimeException類的子類有
Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.IndexOutOfBoundsException
Java.lang.NullPointerException
異常的處理原則
1.并不是try包裹的代碼越多越好,要選擇合適的代碼用try運(yùn)行
2.多個(gè)異??梢允褂枚鄬觕atch來捕獲,分別處理(注:父類異常要寫子類異常的后面)
3.異常處理的過程中可能再次產(chǎn)生一行,可以加上finally代碼塊做最后的工作(finally除System.exit(0)的情況無法運(yùn)行,若break,retrurn等都可以繼續(xù)執(zhí)行);
拓展
①必須在 try 之后添加 catch 或 finally 塊,try 塊后可同時(shí)接 catch 和 finally 塊,但至少有一個(gè)塊。
② 若代碼同時(shí)使用 catch 和 finally 塊,則必須將 catch 塊放在 try 塊之后。
③ catch 塊與相應(yīng)的異常類的類型相關(guān)。
三、Error
當(dāng)程序發(fā)生不可控的錯(cuò)誤時(shí),通常做法是通知用戶并中止程序的執(zhí)行。與異常不同的是Error及其子類的對象不應(yīng)被拋出。
Error是throwable的子類,代表編譯時(shí)間和系統(tǒng)錯(cuò)誤,用于指示合理的應(yīng)用程序不應(yīng)該試圖捕獲的嚴(yán)重問題。
Error由Java虛擬機(jī)生成并拋出,包括動(dòng)態(tài)鏈接失敗,虛擬機(jī)錯(cuò)誤等。程序?qū)ζ洳蛔鎏幚怼?/p>