Java【例外】知識點詳細整理
- 一、含義(理解)
- 二、例外的分類(所有例外都是Throwable的子類)
- 三、例外處理的原理
- 四、例外處理的方式
- 五、重要知識點
一、含義(理解)
指的是【程式在執行程序中】,出現的非正常的情況,最侄訓導致【JVM的非正常停止】,
在java等面向物件的編程語言中,例外本身是一個類,產生例外就是創建例外物件并拋出了一個例外物件,
java處理例外的方式是中斷處理,
例外指的并不是語法錯誤,語法錯了,編譯不通過,不會產生位元組碼檔案,根本不能運行,
二、例外的分類(所有例外都是Throwable的子類)
Java程式運行程序中所發生的例外事件從嚴重性可分為兩類:致命例外Error和非致命例外Exception,
錯誤(Error):JVM系統內部錯誤或資源耗盡等嚴重情況,屬于JVM需要負擔的責任,這一類例外事件無法恢復
或不可能捕獲,將導致應用程式中斷,
簡單來說就是【程式無法處理的系統錯誤,編譯器不做檢查,只能修改程式才能修正】,
例如:OutofMemoryError-------->記憶體溢位的錯誤,創建的陣列太大了,超出了給JVM分配的記憶體.
例外(Exception):其它因編程錯誤或偶然的外在因素導致的一般性問題,這類例外得到恰當的處理時,
程式有機會恢復至正常運行狀況, 簡單來說就是程式可以處理的例外,捕獲后可能恢復,
分為【編譯期例外】(受檢例外)(非RuntimeException)和【運行期例外】(非受檢例外)(RuntimeException)
【編譯期例外】(受檢例外)(非RuntimeException):1.SQLException:操作資料庫例外
2.IOException:輸入輸出例外
3.ClassNotFoundException:指定的類不存在
4.FileNotFoundException:檔案未找到例外
......
【運行期例外】(非受檢例外)(RuntimeException):1.NullPointerException:空指標例外
2.IndexOutOfBoundsException:陣列下標越界例外
3.ArrayIndexOutOfBoundsException:陣列索引越界
4.NumberFormatException:字串轉換為數字例外
5.ClassCastException :資料型別轉換例外
6.ArithmeticException:數學運算例外
......
三、例外處理的原理
- Java程式在執行程序中如果出現例外,會自動生成一個例外類物件,該例外物件將被自動提交給JVM,這個程序稱為拋出(throw)例外
- 當JVM接收到例外物件時,會尋找能處理這例外的代碼,(發現例外:try)
- 找到了,把當前例外物件交給catch處理,這一程序稱為捕獲(catch)例外和處理例外,(捕獲例外:catch)
- 沒找到,如果JVM找不到可以捕獲例外的代碼,則運行時系統將終止,相應的Java程式也將退出,
四、例外處理的方式
1.處理方式1 -------> try catch (主動處理例外)
使用try…catch代碼塊可以捕獲例外,捕獲后可以繼續執行后面的代碼
語法:
? try{
存放可以出現例外的代碼
? } catch(例外型別 e){ 捕獲例外
處理例外
} finally {
不管是否出現例外,都會執行該代碼塊
}
-
try:它后面是一個代碼塊,代碼塊里是可能發生例外的代碼,
-
catch:它后面是可能發生例外的型別以及例外發生后需要做的處理
-
finally:后面是一個代碼塊,主要是例外發生時資源釋放問題
-
catch和finally可以省略其中一個 , catch和finally不能同時省略
-
如果 catch 中 return 了,finally 還會執行,
原因:執行流程:- 先計算回傳值, 并將回傳值存盤起來, 等待回傳
- 執行finally代碼塊
- 將之前存盤的回傳值, 回傳出去;
-
回傳值是在finally運算之前就確定了,并且快取了,不管finally對該值做任何的改變,回傳的值都不
會改變 -
finally代碼中不建議包含return,因為程式會在上述的流程中提前退出,也就是說回傳的值不是try或
catch中的值
2.處理方式2 -------> throws(拋出例外)
throws關鍵字:例外處理的第一種方式,交給別人處理
作用:當方法內部拋出例外物件的時候,那么就必須處理這個例外物件,可以使用throws關鍵字處理例外物件,
會【把例外物件宣告拋出給方法的呼叫者處理】(自己不處理,給別人處理),最終交給JVM處理------>中斷處理,
格式:public 回傳值型別 方法名稱(引數串列,,,)throws AAAException,BBBException...{
throw new AAAException("產生原因");
throw new BBBException("產生原因");
...
};
注意:
1.throws關鍵字必須寫在方法宣告處
2.throws關鍵字后邊宣告的例外必須是Exception或者是Exception的子類
3.方法內部如果拋出了多個例外物件,那么throws后邊必須也宣告多個例外
如果拋出的多個例外物件有子父類關系,那么直接宣告父類例外即可
4.呼叫了一個宣告拋出例外的方法,我們就必須的處理宣告的例外
要么繼續使用throws宣告拋出,交給方法的呼叫者處理,最終交給JVM
要么try…catch自己處理例外
下面展示一些 `行內代碼片`,
使用throws是將例外拋出,誰呼叫該方法,誰就去處理它,
public class Test04 {
public static void main(String[] args) {
try {
method01();
} catch (FileNotFoundException e) {
System.out.println("處理例外");
}
}
public static void method01() throws FileNotFoundException{
method02();
}
public static void method02() throws FileNotFoundException{
method03();
}
public static void method03() throws FileNotFoundException{
method04();
}
//拋出例外,在呼叫方處理
public static void method04() throws FileNotFoundException{
File file = new File("xxx1.txt");
FileInputStream fis = new FileInputStream(file);
}
}
3.處理方式3 -------> throw
throw關鍵字作用:在指定的方法中拋出指定的例外,
格式: throw new xxxException(“例外產生的原因”);
注意:throw關鍵字必須寫在方法的內部
throw關鍵字后邊new的物件必須是Exception或者Exception的子類物件
throw關鍵字拋出指定的例外物件,我們就必須處理這個例外物件
throw關鍵字后邊創建的是RuntimeException或者RuntimeException的子類物件,我們可以不處理,默認交給JVM處理(列印例外物件,中斷程式 )
throw關鍵字創建的是編譯例外(寫代碼的時候報錯),我們就必須處理這個例外,要么throws,要么try...catch
下面展示一些 `行內代碼片`,
throw不能單獨使用,只能配合throws或try{}catch{}使用,
public class Test05 {
@SuppressWarnings("resource")
public static void main(String[] args) {
//throw 拋出例外
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int b = scan.nextInt();
try{
if(b == 0){
throw new MyException();//生成例外物件,將其拋出給JVM
}
}catch (MyException e) {
b = 1;
}
System.out.println(a/b);
scan.close();
}
}
class MyException extends Exception{
private static final long serialVersionUID = -5575465536117397751L;
@Override
public String toString() {
return "除數不能為0的例外";
}
}
五、重要知識點
1.throws和throw的區別
throws:在方法后邊宣告例外,其實就是自己不想對例外做出任何的處理,告訴別人自己可能出現的例外,
交給別人處理,然別人處理
throw:就是自己處理一個例外,有兩種方式要么是自己捕獲例外try...catch代碼塊,
要么是拋出一個例外(throws 例外)
區別:
throws:a.用來宣告一個方法可能產生的所有例外,不做任何處理而是將例外往上傳,誰呼叫我我就拋給誰,
b.用在方法宣告后面,跟的是例外類名
c. 可以跟多個例外類名,用逗號隔開
d. 表示拋出例外,由該方法的呼叫者來處理
e.throws表示出現例外的一種可能性,并不一定會發生這些例外
throw: a.則是用來拋出一個具體的例外型別,
b.用在方法體內,跟的是例外物件名
c.只能拋出一個例外物件名
d. 表示拋出例外,由方法體內的陳述句處理
e.throw則是拋出了例外,執行throw則一定拋出了某種例外
2.throw/throws和try/catch的區別
a."throw/throws"后面的程式不會執行,"try/catch"后面的程式還會執行;
b.throws是表明方法拋出例外,需要呼叫者來處理,如果不想處理就一直向外拋,最后會有jvm來處理;
try catch 是自己來捕獲別人拋出的例外,然后在catch里面去處理;
'一般情況下,第二種情況要好一些,這樣可以清楚地看到例外的原因,并加以修正,
3.try代碼塊:
- try:監視代碼執行程序,一旦發現例外則直接跳轉至catch,如果沒有catch,則直接跳轉至finally,
- catch:可選執行的代碼塊,如果沒有任何例外發生則不會執行;如果發現例外則進行處理或向上拋出,
- finally:必選執行的代碼塊,不管是否有例外產生,即使發生OutOfMemoryError也會執行,通常用于處理善后清理作業,
- finally代碼塊沒有執行的三種可能:
a.沒有進入try代碼塊;
b.進入try代碼塊,但是代碼運行程序出現了死回圈或死鎖狀態;
c.進入try代碼塊,但是執行了System.exit()操作; - finally是在return運算式運行之后執行的,此時將要return的結果已經被暫存起來,待finally代碼塊執行結束后再將之前暫存的結果回傳
- finally代碼塊中使用return陳述句,會使回傳值的判斷變得復雜,
4.自定義例外類
Java提供的例外類,不夠我們使用,需要自己定義一些例外類,
格式:public class XXXException extends Exception/RuntimeException{
添加一個空引數的構造方法;
添加一個帶例外資訊的構造方法;
}
注意:
a.自定義例外類一般都是以Exception結尾,說明該類是一個例外類
b.自定義例外類,必須得繼承Exception或者RuntimeException
繼承Exception:那么自定義的例外類就是一個編譯期例外,如果方法內部拋出了編譯器例外,就必須處理這個例外,要么throws,要么try...catch
繼承RuntimeException:那么自定義的例外類就是一個運行期例外,無需處理,交給虛擬機處理(中斷處理),·
5.多個例外使用捕獲該怎么處理?
1.多個例外分別處理,------>一個一個的處理,寫多個try...catch
2.多個例外一次捕獲,多次處理,------>寫一個try,里面寫多個可能例外的代碼,但是可以寫多個catch來處理,
注意:catch里面定義的例外變數,如果有子父類關系,那么子類的例外變數必須寫在上邊,否則就會報錯,
3.多個例外一次捕獲一次處理,------->一個try,一個catch,catch里面寫一個總的例外型別,
希望各位大神給作者多提一些建議,文中有錯誤或者不當之處,評論區里請留言,作者定會及時改正,大家喜歡的話點個贊,評論一下哇!謝謝支持!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272221.html
標籤:java
上一篇:阿杰初探Java
下一篇:關于Java陣列的那些事
