例外
一、基本介紹
-
基本概念:
Java語言中,將程式執行中發生的不正常情況稱為 “例外”,(開發程序中的語法錯誤和邏輯錯誤不是例外)
-
執行程序中所發生的例外事件可以分為兩類
- Error(錯誤):Java虛擬機無法解決的嚴重問題,如:JVM系統內部錯誤、資源耗盡等嚴重情況,比如:StackOverflowError[堆疊溢位] 和 OOM(out of memory),Error是嚴重錯誤,程式會崩潰,
- Exception:其他因編程錯誤或偶然的外在因素導致的一般性問題,可以是使用針對性的代碼進行處理,例如空指標訪問,試圖讀取不存在的檔案,網路連接中斷等等,Exception 分為兩大類:運行時例外和編譯時例外,
-
例外體系圖一覽


- 例外體系圖小結:
- 例外分為兩大類,運行時例外和編譯時例外,
- 運行時例外,編譯器檢查不出來,一般是指編程時的邏輯錯誤,是程式員應該避免其出現的例外,java.lang.RuntimeException類及它的子類都是運行時例外,
- 對于運行時例外,可以不做處理,因為這類例外很普遍,若全處理可能會對程式的可讀性和運行效率產生影響,
- 編譯時例外,是編譯器要求必須處置的例外,
- 例外體系圖小結:
二、運行時例外
-
常見的運行時例外
-
NullPointerException 空指標例外
當應用程式試圖在需要物件的地方使用 null 時,拋出該例外,
-
ArithmeticException 數字運算例外
當出現例外的運算條件時,拋出此例外,例如,一個整數除以零時,就會拋出此類的一個實體,
-
ArrayIndexOutOfBoundsException 陣列下標越界例外
用非法索引訪問陣列時拋出的例外,如果索引為負或大于等于陣列大小,則該索引為非法索引,
-
ClassCastException 型別轉換例外
當試圖將物件強制型別轉換為不是實體的子類時,拋出該例外,
-
NumberFormatException 數字格式不正確例外
當應用程式試圖將字串轉換成一種數值型別,但該字串不能轉換為適當格式時,拋出該例外,
-
三、編譯時例外
- 介紹:編譯例外是指在編譯期間就必須處理的例外,否則代碼不能通過編譯,
- 常見的編譯例外
- SQLException:操作資料庫時,查詢表可能發生例外
- IOException:操作檔案時,發生的例外
- FileNotFoundException:當操作一個不存在的檔案時,發生例外
- ClassNotFoundException:加載類,而該類不存在時,例外
- EOFException:操作檔案,到檔案末尾,發生例外
- IllegalArguementException:引數例外
四、 例外處理機制
-
基本介紹
例外處理就是當例外發生時,對例外處理的方式 -
例外處理的方式
-
try-catch-finally
程式員在代碼中捕獲發生的例外,自行處理

-
throws
將發生的例外拋出,交給呼叫者(方法)來處理,最頂級的處理者就是JVM,
在例外拋至JVM時,JVM會先輸出例外資訊,然后退出程式,

-
- 對于運行時例外,如果程式員沒有顯式處理例外,默認throws的處理;
- 對于編譯例外,程式中必須處理,比如try-catch 或 throws;
五、 try-catch 例外處理
-
try-catch 方式處理例外說明
-
Java 提供 try 和 catch 塊來處理例外,try塊用于包含可能出錯的代碼,catch塊用于處理try塊中發生的例外,可以根據需要在程式中有多個try-catch塊,
-
基本語法
try{ //可疑代碼 //將例外生成對應的例外物件,傳遞給catch塊 }catch(例外){ //對例外的處理 }finally{ //一定被執行的陳述句 } //如果沒有finally,語法也可以通過
-
-
try-catch 方式處理例外——注意事項
-
如果例外發生了,則例外發生后面的代碼就不會執行,直接進入到catch塊中,
-
如果例外沒有發生,則順序執行try的代碼塊,不會進入到catch,
-
如果希望不管是否發生例外,都執行某段代碼(比如關閉連接,釋放資源等)則使用如下代碼:finally{ };
public class TryCatchDetail {
public static void main(String[] args) {
//1. 如果try中出現例外后,例外代碼后的陳述句不會再執行,直接進入catch代碼塊
//2. 如果例外沒有發生,則順序執行try的代碼塊,不會進入到catch
//3. 如果希望不管是否發生例外,都執行某段代碼(比如關閉連接,釋放資源等)則使用如下代碼 -finally
try {
String str = "韓順平";
int a = Integer.parseInt(str);
System.out.println("數字:" + a);
} catch (NumberFormatException e) {
System.out.println("例外資訊 = " + e.getMessage());
}finally {
System.out.println("finally代碼塊被執行...");
}
System.out.println("程式繼續...");
}
}4. 可以有多個catch陳述句,捕獲不同的例外(進行不同的業務處理),要求父類例外在后,子類例外在前,比如(Exception 在后,NullPotinterException 在前),如果發生例外,只會匹配一個catch,案例如下: ```java public class TryCatchDetail02 { public static void main(String[] args) { //1. 如果try代碼塊有可能有多個例外 //2. 可以使用多個catch 分別捕獲不同的例外,相應處理(一次只能捕獲到一個例外,多個catch是為了應對不同情況) //3. 要求子類例外寫在前面,父類例外寫在后面 try { Person person = new Person(); person = null; System.out.println(person.getName());//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) { e.printStackTrace(); } finally { } } } class Person{ private String name = "jack"; public String getName(){ return name; } } //運行結果:空指標例外 = null-
可以進行try-finally 配合使用,這種用法相當于沒有捕獲例外,因此程式會直接崩掉/退出,應用場景:就是執行一段代碼不管,否發生例外,都必須執行某個業務邏輯
public class TryCatchDetail03 { public static void main(String[] args) { //可以進行try-finally 配合使用,這種用法相當于沒有捕獲例外 //因此程式會直接崩掉/退出,應用場景:就是執行一段代碼不管,否發生例外 //都必須執行某個業務邏輯 try { int n1 = 10; int n2 = 0; System.out.println(n1/n2); } finally { System.out.println("執行了finally..."); } System.out.println("程式繼續執行..."); } }
-
六、 throws 例外處理
-
基本介紹
- 如果一個方法(中的陳述句執行時)可能生成某種例外,但是并不能確定如何處理這種例外,則此方法應顯示地宣告拋出例外,表明該方法將不對這些例外進行處理,而由該方法的呼叫者負責處理,
- 在方法宣告中用throws陳述句可以宣告拋出例外的串列,即可以拋出多個例外,throws關鍵字后面的例外型別可以是方法中產生的例外型別,也可以時它的父類,
import java.io.FileInputStream; import java.io.FileNotFoundException; public class Throws01 { public static void main(String[] args) { } //4. throws后面的例外型別可以是方法中產生的例外,也可以是該例外的父類 public void f2() throws FileNotFoundException,NullPointerException {//或者寫 throws Exception //創建了一個檔案流物件 //1. 這里的例外是一個FileNotFoundException 編譯例外 //2. 可以使用前面的try-catch-finally //3. 也可以使用throws,拋出例外,讓呼叫f2方法的呼叫者處理 //5. throws 關鍵字后面也可以是 例外串列,即可以拋出多個例外 FileInputStream fis = new FileInputStream("d://aa.txt"); } } -
注意事項和使用細節
- 對于編譯例外,程式中必須處理,比如try-catch 或 throws;
- 對于運行時例外,如果程式員沒有顯式處理例外,默認throws的處理;
- 子類重寫父類方法時,對拋出例外的規定:子類重寫的方法,所拋出的例外型別要么和父類拋出的例外一致,要么為父類拋出例外型別的子型別
- 在throws 程序中,如果有方法 try-catch,就相當于處理例外,就可以不必throws
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* @author
* @version 1.0
*/
public class ThrowsDetail {
public static void main(String[] args) {
f2();
}
public static void f2()/* throws ArithmeticException*/{
//1. 對于編譯例外,程式中必須處理,比如try-catch 或 throws
//2. 對于運行時例外,程式中如果沒有處理,默認就是throws的處理
int n1 = 10;
int n2 = 0;
double res = n1/n2;
}
public static void f1() throws FileNotFoundException{
//如果無 throws FileNotFoundException,則f3()呼叫報錯
//f3()方法將編譯例外拋給了呼叫者f1()
//編譯例外必須處理,運行例外默認上拋
//這時就要f1()必須處這個編譯例外
//在f1()中要么try-catch,要么繼續上拋
f3();
}
public static void f3() throws FileNotFoundException {
FileInputStream fis = new FileInputStream("d://aa.txt");
}
public static void f4(){
//這里呼叫沒有問題
//就算f5()有拋出的是運行例外
//而Java中運行例外并不要求程式員顯示處理,因為有默認處理機制,會自動繼續上拋
f5();
}
public static void f5() throws ArithmeticException{}
}
class Father{//父類
public void method() throws RuntimeException{
}
}
class Son extends Father{//子類
//3. 子類重寫父類方法時,對拋出例外的規定:子類重寫的方法
//所拋出的例外型別要么和父類拋出的例外一致,要么為父類拋出例外型別的子型別
//4. 在throws 程序中,如果有方法 try-catch,就相當于處理例外,就可以不必throws
@Override
public void method() throws ArithmeticException {
}
}
七、 自定義例外
-
基本概念
當程式中出現了某些 “錯誤”,但該錯誤資訊并沒有在Throwable子類中描述處理,這個時候可以自己設計例外類,用于描述錯誤資訊,
-
自定義例外的步驟
- 定義類:自定義例外類名(程式員自己寫)繼承Exception或RuntimeException
- 如果繼承Exception,屬于編譯例外
- 如果繼承RuntimeException,屬于運行例外(一般來說,繼承RuntimeException)
-
案例:
public class CustomException { 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. 即把自定義例外做成 運行時例外,好處是我們可以使用默認的處理機制,比較方便 class AgeException extends RuntimeException{ public AgeException(String message){ super(message); } }
八、 throw 和 throws 的區別
| 意義 | 位置 | 后面跟的東西 | |
|---|---|---|---|
| throws | 例外處理的一種方式 | 方法宣告處 | 例外型別 |
| throw | 手動生成例外物件的關鍵字 | 方法體中 | 例外物件 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/540981.html
標籤:其他
