異常類簡述
@
一、前言
作者是一位自學JAVA的小白,通過網上視頻學習和自己對JAVA核心思想一書的理解,現將自己對異常的認知描述如下:(希望能與各位同行好友共同分享自己所學的java知識,同時,也熱切期望各位同行前輩能夠幫助作者指出不足,讓小白的編程技術能更上一層樓,感謝各位同行大佬。
二、異常與錯誤的基本理解
2.1 異常與錯誤的定義
異常: 程序執行過程中發生了不正常的情況。
異常(exceptional condition)是指阻止當前方法或作用域繼續執行的問題。—–JAVA核心思想
小白理解:在程序中可以避免或者解決的錯誤。
錯誤:運行不了的代碼語句或規範。
所有的錯誤只要發生,Java就會終止程序的執行,退出JVM,錯誤不能運行。
2.2 異常分類
異常可以分為:編譯時異常(Exception)和運行時異常(RunTimeException)
編譯時異常:所有的Exception的直接子類,必須在編寫程序的時候預先對這種異常進行處理,如不處理,編譯器報錯。
運行時異常:所有的RuntimeException及子類都屬於運行時異常,運行時異常在編寫程序階段,可以不處理。
編譯時異常大概率會發生(大部分是語法、邏輯、超出類型範圍值等錯誤),運行時異常發生概率相對較小。
需要注意的是,編譯時異常和運行時異常,都是發生在運行階段,因為只有程序運行階段才可以new對象,異常的發生就是new異常對象,編譯時異常必須在編寫階段預先處理,如果不處理,編譯器報錯。
2.3 異常的別名
編譯時異常又稱為受控異常、受檢異常
運行時異常又稱為不受控異常、未受檢異常
三、異常的處理
異常在Java中可以看做是一種類(JAVA宗旨:一切皆可對象,要啥new啥——JAVA核心思想)
3.1 異常處理的兩種方式
1、使用throw,throws關鍵字(Java中自帶的異常),拋給上一級。
2、使用try catch語句捕獲異常
JAVA為了鼓勵人們將可能會拋出的異常告知使用此方法的前端程序員,提供了一種異常聲明的機制,它屬於方法聲明的一部分。
異常說明(throws)
//throws聲明只能拋出發生JAVA自帶的異常類
public static void main(String []args) throws
throw(拋出)
//用於程序員自己產生拋出新建的異常類
throw new //新建的異常類
3.1 異常方法
getMessage();
作用:輸出簡述異常信息
Exception e=new Exception("異常錯誤");
System.out.println(e.Message);
輸出
異常錯誤
exception.printStackTrace();
作用:打印異常追蹤的堆棧信息,類似debug
輸出
//輸出形式
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at note.exception.ExceptionTest04.m3(ExceptionTest04.java:28)
at note.exception.ExceptionTest04.m2(ExceptionTest04.java:24)
at note.exception.ExceptionTest04.m1(ExceptionTest04.java:21)
at note.exception.ExceptionTest04.main(ExceptionTest04.java:34)
需注意的是,Java後台打印異常堆棧追蹤信息的時候,採用了異步線程的方法打印,從上往下一條條看。
3.3 異常的使用
自動拋出
小白理解:只有在main()方法throws Java自帶的異常類或者在最初調用異常語句的方法上聲明Java自帶的異常類,才能向上自動拋出,在其餘方法使用throws只能聲明發生的異常,用於提醒客戶端程序員。
//拋出聲明
public static void main(String []agrs) throws NullPointException{ }
public static void dosome()throws ClassNotFoundException{}
用例:
public class ExceptionTest04 {
private static void m1()throws FileNotFoundException{
m2();
}
private static void m2()throws FileNotFoundException{
m3();
}
private static void m3()throws FileNotFoundException {
new FileInputStream("abcdsesf");
}
public static void main(String[] args) {
try {
m1();
/**
* 調用m1,m2,m3方法,在試圖捕捉異常後,如果捕捉到了,就不再繼續執行該方法後面的語句,轉而執行catch和finally
*/
System.out.println("end");
}
catch (FileNotFoundException e) {
String ep=e.getMessage();//以字符串形式獲取簡述異常信息
//System.out.println(ep);//輸出簡單異常信息
e.printStackTrace();//該方法與debug相似的功能,輸出較詳細的異常語句路徑
System.out.println("begin");
}
finally {
/**
* 在這裡設置文件流的關閉---老猿經驗
* finally內的代碼一定會執行
*/
}
System.out.println("perfect");//try catch後繼續執行
注意:
向上依次拋時,只能是拋向他的父類對象。
只要異常沒有捕捉,採用上拋的方式,發生異常後,異常語句後面就沒有執行。
反之,只要try catch捕捉,當JAVA執行到try中的異常語句時,如發生異常後,停止執
行異常後續代碼,轉而執行catch語句,try catch的下面代碼就能繼續執行。
異常處理機制的作用是增強程序的健壯性
結果:
java.io.FileNotFoundException: abcdsesf (系統找不到指定的文件。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at note.exception.ExceptionTest04.m3(ExceptionTest04.java:28)
at note.exception.ExceptionTest04.m2(ExceptionTest04.java:24)
at note.exception.ExceptionTest04.m1(ExceptionTest04.java:21)
at note.exception.ExceptionTest04.main(ExceptionTest04.java:34)
begin
perfect
手動拋出
throw 異常對象;
//throw new Exception;
注意:Java中異常發生後如果一直採用拋出的形式,最終拋給到main()方法,main()方法繼續向上拋,最終可能導致JVM終止程序運行
捕獲
try{
//可能發生異常的語句
}catch(Exception e){
//e是一個引用變量,指向堆中的Exception
}
finally{
}
注意:try中包含的是可能發生異常的語句,catch能有多個,但必須按照樹狀結構,由底向上,由具體的異常到父類異常捕獲,當異常發生時,異常下面的語句不會執行,轉而執行catch和finally語句(如果有的話)。
3.4 throws和throw的區別
1、作用不同
throw用於程序員自行產生並拋出異常, throws用於聲明在該方法內拋出了異常
2、使用的位置不同
throw位於方法體內部,可以作為單獨語句使用
throws必須跟在方法參數列表的後面,不能單獨使用
3、內容不同
throw拋出一個異常對象,且只能是一個
throws後面跟異常類,而且可以有多個。
四、final finally finalize三者之間的區別
final:是一種關鍵字,被final修飾的類,方法,變量,類不可被繼承,方法不能被重寫,變量值不能被修改,final在修飾變量時通常與static連用。
finally:是一種關鍵字,出現在異常中,finally通常與try連用,在try內沒有System.exit()語句的情況下,finally內的方法一定會被執行。
finalize:是一種標識符,是GC負責清理垃圾回收時的一種方法。