例外
筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html)
運行下面的代碼,看看有什么問題->引出例外和例外處理機制
public static void main(String[] args) {
int num1 =10;
int num2 = 0;
int res = num1 / num2;//會報錯,除數不能為0
System.out.println("程式繼續運行....");
}
處理思路:
public class Test {
public static void main(String[] args) {
int num1 =10;
int num2 = 0;
//解讀
//1. num1 / num2 =>10/ 0
//2.當執行到num1 / num2因為 num2= 0,程式就會出現(拋出)例外ArithmeticException
//3.當拋出例外后,程式就退出,崩潰了,下面的代碼就不在執行
//4.大家想想這樣的程式好嗎?不好,不應該出現了一個不算致命的問題,就導致整個系統崩潰
//5.java設計者,提供了一個叫例外處理機制來解決該問題
// int res = num1 / num2;
//如果程式員,認為一段代碼可能出現例外/問題,可以使用try-catch例外處理機制來解決
// 從而保證程式的健壯性
// 將該代碼塊->選中->快捷鍵ctrl + alt + t ->選中 try-catch
// 6.如果進行例外處理,那么即使出現了例外,程式可以繼續執行
try {
int res = num1 / num2;
} catch (Exception e) {
// e.printStackTrace();
System.out.println("例外原因是:"+e.getMessage());
}
System.out.println("程式繼續運行....");
}
}
例外的概念
基本概念
Java語言中,將程式執行中發生的不正常情況稱為“例外”,(開發程序中的語法錯誤和邏輯錯誤不是例外)
執行程序中所發生的例外事件可分為兩大類
- Error(錯誤):Java虛擬機無法解決的嚴重問題,如:JVM系統內部錯誤、資源耗盡等嚴重情況,比如:StackOverflowError[堆疊溢位]和OOM(out of memory). Error是嚴重錯誤,程式會崩潰,
- Exception:其它因編程錯誤或偶然的外在因素導致的一般性問題,可以使用針對性的代碼進行處理,例如空指標訪問,試圖讀取不存在的檔案,網路連接中斷等等,Exception 分為兩大類:運行時例外[程式運行時,發生的例外]和編譯時例外[編譯時,編譯器檢查出的例外],
★例外體系圖


例外體系圖的小結
- 例外分為兩大類,運行時例外和編譯時例外,
- 運行時例外,編譯器檢查不出來,一般是指編程時的邏輯錯誤,是程式員應該避免其出現的例外,java.lang.RuntimeException類及它的子類都是運行時例外
- 對于運行時例外,可以不作處理,因為這類例外很普遍,若全處理可能會對程式的可讀性和運行效率產生影響
- 編譯時例外,是編譯器要求必須處置的例外,
常見的例外
常見的運行時例外
| 例外類 | 說明 |
|---|---|
| NullPointerException | 空指標例外 |
| ArithmeticException | 數學運算例外 |
| ArraylndexOutOfBoundsException | 陣列下標越界例外 |
| ClassCastException | 型別轉換例外 |
| NumberFormatException | 數字格式不正確例外[] |
常見的運行時例外舉例
- NullPointerException空指標例外
當應用程式試圖在需要物件的地方使用null時,拋出該例外,看案例演示,
public static void main(String[] args) {
String name=null;
System.out.println(name.length());
}
-
ArithmeticException數學運算例外
當出現例外的遺算條件時,拋出此例外,例如,一個整數“除以零”時,拋出此類的一個實體,【前面最開始已經使用此案例,不再過多贅述】 -
ArraylndexOutOfBoundsException陣列下標越界例外用非法索引訪問陣列時拋出的例外,
如果索引為負或大于等于陣列大小,則該索引為非法索引,
public static void main(String[] args) { int[] arr={1,2,5}; for (int i = 0; i <= 3; i++) { System.out.println(arr[i]); } } -
ClassCastException型別轉換例外
當試圖將物件強制轉換為不是實體的子類時,拋出該例外,例如,以下代碼將生成一個ClassCastException
public class Test { public static void main(String[] args) { A b = new B();//向上轉型 B b2 = (B) b;//向下轉型,這里是OK C c2 = (C) b;//這里拋出ClassOastException } } class A {} class B extends A {} class C extends A {} -
NumberFormatException數字格式不正確例外
當應用程式試圖將字串轉換成一種數值型別,但該字串不能轉換為適當格式時,拋出該例外=>使用例外我們可以確保輸入是滿足條件數字.
public static void main(String[] args) { String name = "韓順平教育"; //將String 轉成int int num = Integer.parseInt(name);//拋出NumberFormatException System.out.println(num); }
編譯例外
介紹
編譯例外是指在編譯期間,就必須處理的例外,否則代碼不能通過編譯,
常見的編譯例外
SQLException //操作資料庫時,查詢表可能發生例外
IOException//操作檔案時,發生的例外
FileNotFoundException //當操作一個不存在的檔案時,發生例外
ClassNotFoundException //加載類,而該類不存在時,例外
EOFException//操作檔案,到檔案末尾,發生例外
IllegalArguementException//引數例外
例外處理
基本介紹
例外處理就是當例外發生時,對例外處理的方式,
例外處理的方式
-
try-catch-finally
程式員在代碼中捕獲發生的例外,自行處理try { // 代碼/可能有例外 }catch(Exception e){ //捕獲到例外 //1.當例外發生時 //2系統將例外封裝成Exception物件e,傳遞給catch //3得到例外物件后,程式員,自己處理 //4.注意,如果沒有發生例外catch代碼塊不執行 }finally { //1.不管try代碼塊是否有例外發生,始終要執行finally //2.所以,通常將釋放資源的代碼,放在finally } -
throws
將發生的例外拋出,交給呼叫者(方法)來處理,最頂級的處理者就是JVM- try-catch-finally和throws二選一
- 如果程式員沒做相應處理,沒有顯示是處理例外,默認throws

try-catch例外處理
try-catch方式處理例外說明
-
Java提供try和catch塊來處理例外,try塊用于包含可能出錯的代碼,catch塊用于處理try塊中發生的例外,可以根據需要在程式中有多個try..catch塊,
-
基本語法
try { //可疑代碼 //將例外生成對應的例外物件,傳遞給catch塊 }catch(例外){ //對例外的處理 } //沒有finally,語法是可以通過的
try-catch方式處理例外-注意事項
-
如果例外發生了,則例外發生后面的代碼不會執行,直接進入到catch塊.
-
如果例外沒有發生,則順序執行try的代碼塊,不會進入到catch.
-
如果希望不管是否發生例外,都執行某段代碼(比如關閉連接,釋放資源等)則使用finally {}
-
可以有多個catch陳述句,捕獲不同的例外(進行不同的業務處理),要求父類例外在后,子類例外在前,比如(Exception在后,NullPointerException在前),如果發生例外,只會匹配一個catch,【案例演示】
public static void main(String[] args) { //解讀 //1.如果try代碼塊有可能有多個例外 //2.可以使用多個catch分別捕獲不同的例外,相應處理 //3.要求子類例外寫在所面,父類例外寫在后面 try { String person = null; System.out.println(person.length());//NullPointerException int n1 = 10; int n2 = 0; int res = n1 / n2; //ArithmeticException } catch (NullPointerException e) { System.out.println("空指標例外=" + e.getMessage()); } catch (ArithmeticException e) { System.out.println("算術例外=" + e.getMessage()); } catch (Exception e) { System.out.println(e.getMessage()); } finally { } } -
可以進行try-finally 配合使用,這種用法相當于沒有捕獲例外,因此程式會直接崩掉,應用場景,就是執行一段代碼,不管是否發生例外,都必須執行某個業務邏輯
public static void main(String[] args) { try { int n1 = 10; int n2 = 0; System.out.println(n1 / n2); } finally { System.out.println("執行了finally..");//無論是否會報錯都會執行 } System.out.println("程式繼續執行..");//因為上面報錯,finally執行后就強制停止運行,這行不執行 }
try-catch-finally執行順序小結
- 如果沒有出現例外,則執行try塊中所有陳述句,不執行catch塊中陳述句,如果有finally,最后還需要執行finally里面的陳述句
- 如果出現例外,則try塊中例外發生后,try塊剩下的陳述句不再執行,將執行catch塊中的陳述句,如果有finally,最后還需要執行finally里面的陳述句!
throws例外處理
基本介紹
-
如果一個方法(中的陳述句執行時)可能生成某種例外,但是并不能確定如何處理這種例外,則此方法應顯示地宣告拋出例外,表明該方法將不對這些例外進行處理,而由該方法的呼叫者負責處理,
-
在方法宣告中用throws陳述句可以宣告拋出例外的串列,throws后面的例外型別可以是方法中產生的例外型別,也可以是它的父類,
public void f2() throws FileNotFoundException,NullPointerException,ArithmeticException { //創建了一個檔案流物件 //解讀: //1.這里的例外是一個FileNotFoundException 編譯例外 // 2,使用前面講過的 try-catch-finally //3.使用throws,拋出例外,讓呼叫f2方法的呼叫者(方法)處理 //4. throws后面的例外型別可以是方法中產生的例外型別,也可以是它的父類 // 5. throws 關鍵字后也可以是例外串列,即可以拋出多個例外 FileInputStream fis = new FileInputStream("d://aa.txt"); }
注意事項和使用細節
- 對于編譯例外,程式中必須處理,比如try-catch 或者throws
- 對于運行時例外,程式中如果沒有處理,默認就是throws的方式處理[舉例]
- 子類重寫父類的方法時,對拋出例外的規定:子類重寫的方法,所拋出的例外型別要么和父類拋出的例外一致,要么為父類拋出的例外的型別的子型別[舉例]
- 在throws程序中,如果有方法 try-catch,就相當于處理例外,就可以不必throws
自定義例外
自定義例外的步驟
- 定義類:自定義例外類名(程式員自己寫)繼承Exception或RuntineException
- 如果繼承Exception,屬于編譯例外
- 如果繼承RuntimeException,屬于運行例外(一般來說,繼承RuntimeException),
自定義例外的應用實體
當我們接收Person物件年齡時,要求范圍在18-120之間,否則拋出一個自定義例外(要求繼承RuntimeException),并給出提示資訊,
public class Test {
public static void main(String[] args) {
int age = 180;
//要求范圍在18 -120之間,否則拋出一個自定義例外
if (!(age >= 18 && age <= 120)) {
//這里我們可以通過構造器,設定資訊
throw new AgeException("年齡需要在18~120之間");
}
System.out.println("你的年齡范圍正確,");
}
}
//自定義一個例外
// 解讀
//1.一般情況下,我們自定義例外是繼承 RuntimeException
//2.即把自定義例外做成運行時例外,好處時,我們可以使用默認的處理機制
//3.即比較方便
class AgeException extends RuntimeException {
public AgeException(String message) {//構造器
super(message);
}
}
throw和throws的對比
一覽表
| 意義 | 位置 | 后面跟的東西 | |
|---|---|---|---|
| throws | 例外處理的一種方式 | 方法宣告處 | 例外型別 |
| throw | 手動生成例外物件的關鍵字 | 方法體中 | 例外物件 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501492.html
標籤:其他
上一篇:Java學習-第一部分-第二階段-第二節:列舉和注釋
下一篇:元組(tuple)
