1.什么是異常
-
Java把異常當做對象來處理,並定義了一個基類java.lang.Throwable作為所有異常的超類。
-
在Java API中已經定義了許多異常類,這些異常類分為兩大類,錯誤Error和異常Exception。

Error
-
Error類對象由Java虛擬機生成並拋出,大多數錯誤與代碼編寫者所執行的操作無關。
-
Java虛擬機運行錯誤(Virtual MachineError),當JVM不再有繼續執行操作所需的內存資源時,將出現OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止;
Exception
-
在Exception分支中有一個重要的子類RuntimeException(運行時異常)
-
ArraylndexOutOfBoundsException(數組下標越界)
-
NullPointerException(空指針異常)
-
ArithmeticException(算數異常)
-
MissingResourceException(丟失資源)
-
ClassNotFoundException(找不到類)等異常,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理
-
-
這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生;
-
Error和Exception的區別:Error通常是災難性的致命的錯誤,是程序無法控制和處理的,當出現這些異常時,Java虛擬機(JVM)一般會選擇終止線程;Exception通常情況下是可以被程序處理的,並且在程序中應該盡可能的去處理這些異常。
3.Java異常處理機制
-
拋出異常
-
捕獲異常
-
異常處理五個關鍵字
-
try 、catch、 finally 、throw、throws
-
4.處理異常
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 可以不要finally ,假設IO,資源,關閉
}
public void a(){
b();
}
public void b(){
a();
}
public class Test2 {
public static void main(String[] args) {
int a =1;
int b =0;
//Ctrl +Alt +T
try {
System.out.println(a/b);//選中它,Ctrl +Alt +T
} catch (Exception e) {
e.printStackTrace();//打印錯誤的棧信息
} finally {
}
}
}
public class Test {
public static void main(String[] args) {
try {
new Test().test(1,0);
} catch (Exception e) {
e.printStackTrace();
}
}
//假設這方法中,處理不了這個異常,方法上拋出異常
public void test(int a,int b) throws ArithmeticException{
if(b==0){
throw new ArithmeticException();//主動的拋出異常,一般在方法中使用
}
}
}
5.自定義異常
-
在程序中使用自定義異常類,大體可分為以下幾個步驟:
-
1.創建自定義異常類
-
2.在方法中通過throw關鍵字拋出異常
-
3.如果在當前拋出異常的方法中處理異常,可以使用try-catch語句捕獲並處理;否則在方法的聲明處通過throws關鍵字指明要拋出給方法調用者的異常,繼續進行下一步操作。
-
4.在出現異常方法的調用者中鋪貨並處理異常。
-
//自定義的異常類
public class MyException extends Exception {
//傳遞數字>10
public int detail;
public MyException(int a) {
this.detail = a;
}
//toString:異常的打印信息
@Override
public String toString() {
return "MyException{"+ detail + '}';
}
}
public class Test {
//可能會存在異常的方法
static void test(int a) throws MyException {
System.out.println("傳遞的參數為:"+a);
if(a>10){
throw new MyException(a);//拋出
}
System.out.println("OK");
}
public static void main(String[] args) {
try {
test(11);
} catch (MyException e) {
System.out.println("MyException "+e);
}
}
}
6.總結
-
處理運行時異常時,采用邏輯去合理規避同時輔助try-catch處理
-
在多重catch后面,可以加一個catch(Exception)來處理可能會被遺漏的異常
-
對於不確定的代碼,也可以加上try-catch,處理潛在的異常
-
盡量去處理異常,切忌只是簡單地調用printStackTrace()去打印輸出
-
具體如何處理異常,要根據不同的業務需求和異常類型去解決
-
盡量添加finally語句塊去釋放占用的資源
