非運行時異常
運行時異常
-
ArrayIndexOutOfBoudsException(數組下標越界)
-
NullPointerException(空指針異常)
-
ArithmeticException (算術異常)
-
-
ClassNotFoundException(找不到類)等
這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。一般都是由於程序邏輯錯誤引起的,應該從邏輯角度盡可能避免這些異常的發生。
錯誤ERROR
-
由Java虛擬機生成並拋出,大多數錯誤與代碼編寫者所執行的操作無關
-
Java虛擬機運行錯誤,當jvm不再有繼續執行操作所需的內存資源時,將出現OutOfMemoryError。jvm會選擇線程終止。
-
jvm試圖執行應用時,如類定義錯誤(NoClassDefFoundError)、連接錯誤(LinkageError)。這些錯誤是不可查的,因為它們在應用程序的控制和處理能力之外,而且絕大多數是程序運行是不允許出現的狀況。
異常處理機制
拋出異常
Test3
package com.Exception.demo01;
public class Test3 {
public static void main(String[] args) {
new Test3().test(1,0);
}
//假設在方法中,處理不了這個異常,方法上拋出異常
public void test(int a,int b){
if (b==0){
throw new ArithmeticException(); //主動拋出異常,一般在方法中使用
}
System.out.println(a/b);
}
}
捕獲異常
package com.Exception.demo01;
public class Demo01 {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {//try 監控區域
System.out.println(a/b);
}catch(ArithmeticException e){// catch 捕獲異常
System.out.println("程序出現錯誤,變量b不能為0");
}finally {
System.out.println("finally");
}
//finally 可以不要fanally 假設IO、資源、關閉!
}
}
捕獲多個異常
package com.Exception.demo01;
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
//假設要捕獲多個異常:從小到大
try {//try 監控區域
System.out.println(a/b);;
}catch(Error e){// catch(想要捕獲的異常類型) 捕獲異常
System.out.println("Error");
}catch (Exception e){
System.out.println("Exception");
}catch (Throwable t){
System.out.println("Throwable");
} finally {//處理善后工作
System.out.println("finally");
}
//finally 可以不要fanally 假設IO、資源、關閉!
}
}
快捷鍵 Ctrl + Alt + T
package com.Exception.demo01;
public class Test2 {
public static void main(String[] args) {
int a =1;
int b = 0;
//Ctrl + Alt + T
try {
System.out.println(a/b);
} catch (Exception e) {
e.printStackTrace(); //打印錯誤的棧信息
} finally {
}
}
}
自定義異常類
用戶自定義異常類,只需繼承Exception類即可。
使用自定義異常類的步驟
-
創建自定義異常類
-
在方法中通過throw關鍵字拋出異常對象
-
如果在當前拋出異常的方法中處理異常,可以使用try-catch語句捕獲並處理;否則在方法的聲明出通過throws關鍵字指明要拋出給方法調用者的異常,繼續進行下一步操作
-
在出現異常方法的調用者中捕獲並處理異常。
MyException
package com.Exception.demo02;
//自定義的異常類
public class MyException extends Exception{
//傳遞數字> 10;
private int detail;
public MyException(int a){
this.detail = a;
}
//toString:異常的打印信息
Test
package com.Exception.demo02;
public class Test {
//可能會存在異常的方法
static void test(int a) throws MyException {
System.out.println("傳遞的參數是:" + a); //拋出
if (a > 10){
throw new MyException(a);
}
}
public static void main(String[] args) {
try {
test(11);
}catch (MyException e){
System.out.println("MyException=> " + e);
}
}
}
實際應用中的經驗總結
-
處理運行時異常時,采用邏輯去合理規避同時輔助try-catch處理
-
在多重catch塊后面,可以加一個catch(Exception)來處理可能會被遺漏的異常
-
對於不確定的代碼,也可以加上try-catch,處理潛在的異常
-
盡量去處理異常,切忌只是簡單地調用printStackTrace()去打印輸出
-
具體如何處理異常,要根據不同的業務需求和異常類型去決定
-
