異常的概念java
異常,就是不正常的意思。在生活中:醫生說,你的身體某個部位有異常,該部位和正常相比有點不一樣,該部位的功能將受影響.在程序中的意思就是:指的是程序在執行過程當中,出現的非正常的狀況,終會致使JVM的非正常中止程序員
注意:在Java等面向對象的編程語言中,異常自己是一個類,產生異常就是建立異常對象並拋出了一個異常對象。Java處理異常的方式是中斷處理、異常指的並非語法錯誤,語法錯了,編譯不經過,不會產生字節碼文件,根本不能運行.編程
異常體系數組
異常機制實際上是幫助咱們找到程序中的問題,異常的根類是 java.lang.Throwable ,其下有兩個子類: java.lang.Error 與 java.lang.Exception ,日常所說的異常指 java.lang.Exception 編程語言
Throwable體系ui
Error:嚴重錯誤Error,沒法經過處理的錯誤,只能事先避免,比如絕症。 spa
Exception:表示異常,異常產生後程序員能夠經過代碼的方式糾正,使程序繼續運行,是必需要處理的。好比感冒、闌尾炎調試
Throwable中的經常使用方法日誌
public void printStackTrace() :打印異常的詳細信息。 包含了異常的類型,異常的緣由,還包括異常出現的位置,在開發和調試階段,都得使用printStackTrace。 code
public String getMessage() :獲取發生異常的緣由。 提示給用戶的時候,就提示錯誤緣由。
public String toString() :獲取異常的類型和異常描述信息(不用)。
異常(咱們日常所說的異常就是Exception)的分類
編譯時期異常:checked異常。在編譯時期,就會檢查,若是沒有處理異常,則編譯失敗。(如日期格式化異常)
運行時期異常:runtime異常。在運行時期,檢查異常.在編譯時期,運行異常不會編譯器檢測(不報錯)。(如數學異常)
異常的處理
Java異常處理的五個關鍵字:try、catch、finally、throw、throws
拋出異常throw
在java中,提供了一個throw關鍵字,它用來拋出一個指定的異常對象
1. 建立一個異常對象。封裝一些提示信息(信息能夠本身編寫)。
2. 須要將這個異常對象告知給調用者。怎麼告知呢?怎麼將這個異常對象傳遞到調用者處呢?經過關鍵字throw 就能夠完成。throw 異常對象。
throw用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,並結束當前方法的執行
使用格式:throw new 異常類名(參數);
1 package demosummary.exception; 2
3 public class ThrowDemo { 4 public static void main(String[] args) { 5 //建立數組
6 int[] arr = {2, 4, 6, 8}; 7 //根據索引找元素
8 int index = 4; 9 int element = getElement(arr, index); 10 System.out.println(element); 11 System.out.println( "over"); 12 } 13
14 /*
15 根據索引找到元素 16 */
17 private static int getElement(int[] arr, int index) { 18 //判斷是否索引越界異常
19 if (index < 0 || index > arr.length - 1) { 20 /*判斷條件若是知足,當執行完throw拋出異常對象後,方法已經沒法繼續運算 21 這時就會結束當前方法的執行,並將異常告知給調用者。這時就須要經過異常來解決 22 */
23 throw new ArrayIndexOutOfBoundsException("哥們,角標越界了~~~"); 24 } 25 int element = arr[index]; 26 return element; 27 } 28 }
Objects非空判斷
public static <T> T requireNonNull(T obj) :查看指定引用對象不是null
1 package demosummary.exception; 2
3 public class Objects非空判斷 { 4 public static void main(String[] args) { 5 Integer a = null;
//調用方法reqireNonNull 6 requireNonNull(a); 7 } 8
9 public static <T> T requireNonNull(T obj) { 10 //判斷是否爲空
11 if (obj == null) { 12 throw new NullPointerException(); 13 } 14 return obj; 15 } 16
17 /**
18 * 執行結果 19 * Exception in thread "main" java.lang.NullPointerException 20 * at demosummary.exception.Objects非空判斷.requireNonNull(Objects非空判斷.java:11) 21 * at demosummary.exception.Objects非空判斷.main(Objects非空判斷.java:6) 22 */
23 }
聲明異常throws
聲明異常:將問題標識出來,報告給調用者。若是方法內經過throw拋出了編譯時異常,而沒有捕獲處理(稍後講 解該方式),那麼必須經過throws進行聲明,讓調用者去處理。
關鍵字throws運用於方法聲明之上,用於表示當前方法不處理異常,而是提醒該方法的調用者來處理異常(拋出異常).
格式:修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2…{ }
1 package demosummary.exception; 2
3 import java.io.FileNotFoundException; 4 import java.io.IOException; 5
6 public class ThrowsDemo { 7 public static void main(String[] args) throws IOException { 8 read("a.txt"); 9 } 10
11 public static void read(String path) throws FileNotFoundException,IOException{ 12 if (!path.equals("a.txt")) { 13 /*
14 若是不是a.txt這個文件,則認爲該文件不存在,是一個錯誤,也就是一個異常 throw 15 */
16 throw new FileNotFoundException("文件不存在"); 17 } 18 if (!path.equals("b.txt")) { 19 throw new IOException(); 20 } 21 } 22 }
捕獲異常try…catch
若是異常出現的話,會馬上終止程序,因此咱們得處理異常:
1. 該方法不處理,而是聲明拋出,由該方法的調用者來處理(throws)。
2. 在方法中使用try-catch的語句塊來處理異常。
try-catch的方式就是捕獲異常。
捕獲異常:Java中對異常有針對性的語句進行捕獲,能夠對出現的異常進行指定方式的處理。
格式:
try{
編寫可能會出現異常的代碼
}catch(異常類型 e){
處理異常的代碼
//記錄日誌/打印異常信息/繼續拋出異常
}
try:該代碼塊中編寫可能產生異常的代碼。
catch:用來進行某種異常的捕獲,實現對捕獲到的異常進行處理
注意:try和catch都不能單獨使用,必須連用
1 package demosummary.exception; 2
3 import java.io.FileNotFoundException; 4 import java.io.IOException; 5
6 public class ThrowsDemo { 7 public static void main(String[] args) { 8 //當有異常產生時,咱們必需要處理,要麼聲明,要麼捕獲
9 try { 10 read("a.txt"); 11 } catch (FileNotFoundException e) { 12 //try中拋出什麼異常,在括號中就定義什麼異常類型
13 e.printStackTrace(); 14 } 15 System.out.println("over"); 16 } 17
18 public static void read(String path) throws FileNotFoundException{ 19 if (!path.equals("a.txt")) { 20 /*
21 若是不是a.txt這個文件,則認爲該文件不存在,是一個錯誤,也就是一個異常 throw 22 */
23 throw new FileNotFoundException("文件不存在"); 24 } 25 } 26 }
public String getMessage() :獲取異常的描述信息,緣由(提示給用戶的時候,就提示錯誤緣由。
public String toString() :獲取異常的類型和異常描述信息(不用)。
public void printStackTrace() :打印異常的跟蹤棧信息並輸出到控制檯。
finally 代碼塊
finally:有一些特定的代碼不管異常是否發生,都須要執行。另外,由於異常會引起程序跳轉,致使有些語句執行 不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是必定會被執行的。
finally的語法: try...catch....finally:自身須要處理異常,終還得關閉資源。(注意:finally不能單獨使用)
1 package demosummary.exception; 2
3 import java.io.FileNotFoundException; 4
5 public class TryCatchFinally異常處理 { 6 public static void main(String[] args) { 7 //當有異常產生時,咱們必需要處理,要麼聲明,要麼捕獲
8 try { 9 read("a.txt"); 10 } catch (FileNotFoundException e) { 11 //try中拋出什麼異常,在括號中就定義什麼異常類型
12 e.printStackTrace(); 13 }finally { 14 System.out.println("無論程序怎樣,這裏都將會被執行。"); 15 } 16 System.out.println("over"); 17 } 18
19 public static void read(String path) throws FileNotFoundException{ 20 if (!path.equals("a.txt")) { 21 /*
22 若是不是a.txt這個文件,則認爲該文件不存在,是一個錯誤,也就是一個異常 throw 23 */
24 throw new FileNotFoundException("文件不存在"); 25 } 26 } 27 }
當只有在try或者catch中調用退出JVM的相關方法,此時finally纔不會執行,不然finally永遠會執行。
異常注意事項
多個異常使用捕獲又該如何處理呢?
1. 多個異常分別處理。
2. 多個異常一次捕獲,屢次處理。
3. 多個異常一次捕獲一次處理。
通常咱們是使用一次捕獲屢次處理方式,格式以下:
try{
編寫可能會出現異常的代碼
}catch(異常類型A e){ 當try中出現A類型異常,就用該catch來捕獲.
處理異常的代碼
//記錄日誌/打印異常信息/繼續拋出異常
}catch(異常類型B e){ 當try中出現B類型異常,就用該catch來捕獲.
處理異常的代碼
//記錄日誌/打印異常信息/繼續拋出異常
}
注意:這種異常處理方式,要求多個catch中的異常不能相同,而且若catch中的多個異常之間有子父類異 常的關係,那麼子類異常要求在上面的catch處理,父類異常在下面的catch處理。
運行時異常被拋出能夠不處理。即不捕獲也不聲明拋出。
若是finally有return語句,永遠返回finally中的結果,避免該狀況.
若是父類拋出了多個異常,子類重寫父類方法時,拋出和父類相同的異常或者是父類異常的子類或者不拋出異 常。
父類方法沒有拋出異常,子類重寫父類該方法時也不可拋出異常。此時子類產生該異常,只能捕獲處理,不能聲明拋出