Java 異常詳解。本站提示廣大學習愛好者:(Java 異常詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java 異常詳解正文
一.異常與錯誤的區別
再講異常之前我們就應該要知道異常和錯誤的區別
Error類和Exception類的父類都是throwable類,他們的區別是:
Error類普通是指與虛擬機相關的問題,如零碎解體,虛擬機錯誤,內存空間缺乏,辦法調用棧溢等。關於這類錯誤的招致的使用順序中綴,
僅靠順序自身無法恢復和和預防,遇到這樣的錯誤,建議讓順序終止。
Exception類表示順序可以處置的異常,可以捕捉且能夠恢復。遇到這類異常,應該盡能夠處置異常,使順序恢復運轉,而不應該隨意終止異常。
二.異常的表現分類:
1.checked 異常反省期異常 java.lang.Excetion 在編譯期需求人工處置否則編譯失敗:Exception的子類除了運轉期異常都是反省期異常
2.非Checked異常運轉時異常 java.lang.RuntimeException 不需求處置的直接能編譯經過:一切的RuntimeException以及其子類都是運轉異常
舉例:運轉期異常
後果:運轉期異常,當你敲好代碼時不會報錯,而當你運轉時才會報除數不能為0的錯誤
舉例:反省期異常:
後果:反省期異常,當你編譯的時分就會報錯,一定要拋出異常編譯才干經過
三.異常的處置機制
Java言語次要依賴於 try catch finally 和throws throw 五個關鍵字來描繪異常
1) 在發作異常的中央直接處置
運用try catch finally 直接處置異常
a) try-catch-finally構造中try塊是必需有的,catch和finally塊為可選,但兩者至多必需呈現其中之一。
b) catch 可以同時呈現多個,但一個異常最多捕捉一個catch,而且catch的順序是從上往下
c) finally 無論能否捕捉異常都會執行的一行代碼
演示1:try異常
public class TestException { public static void main(String[] args) { int c = 0; try { int a = 3; int b = 0; // 這塊代碼呈現了異常 c = a / b; // 那麼異常之後的代碼都不會被執行 System.out.println("Hello World"); } catch (ArithmeticException e) { System.out.println("除數不能為零"); } finally { //不論有沒有發作異常,finally語句塊都會被執行 System.out.println("Welcome"); } System.out.println(c); // 當b為0時,有異常,輸入為c的初始值0 } } //輸入後果:除數不能為零 Welcome 0 try異常
演示2:帶有return的異常
import java.io.FileInputStream; import java.io.FileNotFoundException; public class DemoException { public static void main(String[] args) { int a=test3(); System.out.println(a); } @SuppressWarnings("finally") public static int test3(){ try { System.out.println(9 / 0); return 1; } catch (Exception e) { System.out.println("捕捉到了異常...."); return 2; }finally{ System.out.println("無論如何都會執行的代碼..."); return 3; } } } //輸入後果 "呵呵""哈哈" 3 帶有return異常
得出結論:作用范圍 return 終止整個辦法體,但在finally呈現之前 return是老大 finally 作用范圍> return
2)將異常拋給調用者讓調用者處置
//throws在辦法體頭部經過聲明 拋出異常... public void dealFile() throws FileNotFoundException{ FileInputStream fis =new FileInputStream("C:/name.txt"); } //那麼那麼下面調用這個辦法可以選擇是持續拋出,還是捕捉異常
案例一:經過throws拋出異常,調用者直接捕捉拋出的異常
public class TestException { public static void main(String[] args) { try { Test3(); //這裡選擇直接捕捉異常,而不是在拋出異常 } catch (NumberFormatException e) { System.err.println("非數據類型不能轉換。"); } //System.err.println();這種輸入方式可以輸入錯誤的音訊,在控制台出現白色。 } public static void Test3() throws NumberFormatException{ String s = "abc"; System.out.println(Double.parseDouble(s)); } } throws異常
運轉後果:
非數據類型不能轉換。
留意:運用Throws是的限制
兩小准繩
運用throws 聲明拋出異常一個限制
子類承繼父類重寫父類的辦法
子類拋出的異常必需比父類少
子類拋出的異常必需比父類小
兩小准繩是針對反省期異常的,運轉期異常不遵照這個規則(RuntimeException 以及子類)
案例二:經過throw拋出異常
public class TestException { public static void main(String[] args) { String s = "abc"; if(s.equals("abc")) { throw new NumberFormatException("不能相等"); } else { System.out.println(s); } } } throw異常
運轉後果如下:
面試題:Throw 和Throws有什麼區別?
Throw語句是用在辦法體內表示拋出的異常由辦法體內的語句處置
Throws 語句是在辦法聲明之後拋出異常表示在拋出的異常交給調用者處置
Throws 要麼運用try –catch –finally 處置要麼持續拋出
四.自定義異常
所謂自定義異常,通常就是定義一個類,去承繼Exception類或許它的子類。由於異常必需直接或許直接地承繼自Exception類。
通常狀況下,會直接承繼自Exception類,普通不會承繼某個運轉時的異常類。
自定義異常可以用於處置用戶登錄錯誤,用戶輸出錯誤提示等。
自定義異常需求遵照以下步驟
承繼RuntimeExcetion 或許Exception 寫一個無參的結構函數 寫一個String類型的結構函數舉例:自定義異常:
public class MyException extends Exception { public MyException() { super(); } public MyException(String message) { super(message); } }
一種處置異常方式
public class ExceptionTest4 { public void method(String str) throws MyException { if(null == str) { throw new MyException("傳入的字符串參數不能為null!"); } else { System.out.println(str); } } public static void main(String[] args) throws MyException //異常處置方式1,不時向外拋出 { ExceptionTest4 test = new ExceptionTest4(); test.method(null); } }
另一種異常處置方式:
public class ExceptionTest4 { public void method(String str) throws MyException { if (null == str) { throw new MyException("傳入的字符串參數不能為null!"); } else { System.out.println(str); } } public static void main(String[] args) { //異常處置方式2,采用try...catch語句 try { ExceptionTest4 test = new ExceptionTest4(); test.method(null); } catch (MyException e) { e.printStackTrace(); } finally { System.out.println("順序處置終了"); } } }
最後說一句,try-catch-finally雖好用,但是假如是濫用,這樣只是會讓順序的可讀性變的很蹩腳,當順序報錯,就無法疾速精確的定位了。
以上就是本文的全部內容,希望本文的內容對大家的學習或許任務能帶來一定的協助,同時也希望多多支持!