java之異常捕獲及處理
一、處理異常
try{
//有可能出異常的語句
} [catch (異常型別 物件) {
//異常處理
} catch (異常型別 物件) {
//異常處理
} catch (異常型別 物件) {
//異常處理
}...] [finally {
//不管是否出現異常,都執行的程式碼
}
1、printStackTrace()方法:進行異常資訊輸出
public class Main {
public static void main(String[] args) {
System.out.println("11");
try {
System.out .println(10 / 0);
} catch (ArithmeticException e) {
e.printStackTrace();
} finally {
System.out.println("11123");
}
}
注意事項:在try出錯語句之後的語句不再執行
public class Main {
public static void main(String[] args) {
System.out.println("11");
try {
System.out.println(10 / 0);
// 在try出錯語句之後的語句,不再執行了
System.out.println("!!");
} catch (ArithmeticException e) {
System.out.println("出錯了");
} finally {
System.out.println("11123");
}
}
}
輸出結果:
11
出錯了
11123
二、Error和Exception的區別
Error:指的是JVM的錯誤,此時程式還沒有執行,使用者無法處理的異常
Exception:程式執行中產生的異常,使用者可以處理,我們一般說的處理異常就是指的Exception類以及他的子類的異常
三、java中處理異常的流程
1、程式執行出現異常時,JVM會自動根據異常的型別例項化一個與之匹配的異常類物件(此時使用者不用去關心new,由系統自動負責處理)
2、產生異常物件後,會判斷當前語句上是否存在有異常處理,如果沒有,就交給JVM進行預設處理,處理的方式:輸出異常資訊,而後結束程式呼叫
3、如果此時存在異常的捕獲操作,那麼會由try語句來捕獲產生的異常類例項化物件,而後與try語句後的每一個catch進行比較,如果有符合的catch捕獲型別,則使用當前catch語句進行異常處理,如果不匹配則向下繼續匹配catch
4、 不管最後異常處理 是否能匹配,那麼都要向後執行,如果此時存在finally語句,那麼先執行finally中的程式碼,但是執行完畢後需要根據之前catch匹配結果來決定如何執行,如果之前已經成功捕獲了異常,那麼就繼續執行fianlly之後的程式碼,如果沒有捕獲成功,那麼就將此異常交給JVM進行預設處理
四、兩點說明
1、在編寫多個catch捕獲異常的時候,捕獲範圍大的異常一定要放在捕獲範圍小的異常之後,否則程式編譯錯誤
2、雖然直接捕獲Exception比較方便,但是這樣也不好,因為所有的異常都會按照同樣一種方式處理,如果在一些要求嚴格的專案裡面,異常一定要分開處理比較好
五、throws關鍵字
主要用於方法宣告上,指的是當方法之中出現異常後交由被呼叫處處理,呼叫處不管是都出現異常,都要用try catch進行異常的處理
public class Main {
// 存在throws,表示該方法產生的異常,交給被呼叫處使用
public static int t(int x, int y) throws Exception {
return x / y;
}
public static void main(String[] args) {
// 不管對與錯,都要使用try catch進行處理
try {
System.out.println(t(10, 2));
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:不要在主方法中加上throws,因為加上後異常會拋給JVM進行預設處理
六、throw關鍵字
在程式之中,可以直接手工的丟擲一個異常類的例項化物件
public class Main {
public static void main(String[] args) {
try {
throw new Exception("自己定義的異常");
} catch (Exception e) {
e.printStackTrace();
}
}
}
六、throw和throws的區別
throw:指的是在方法中人為丟擲一個異常類物件(這個異常類物件可能是自己例項化或者 是丟擲已存在的)
throws:在方法的宣告上使用,表示此方法在呼叫時必須處理異常
七、異常的使用格式
public class Main {
public static int t(int x, int y) throws Exception {
int result = 0;
try {
result = x / y;
} catch (Exception e) {
throw e;// 繼續向上拋異常,拋給main方法的try catch進行異常輸出
} finally {
System.out.println("kkkk");
}
return result;
}
public static void main(String[] args) {
try {
System.out.println(t(10, 0));
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("fianlly");
}
}
}
縮寫:try…finally
public class Main {
public static int t(int x, int y) throws Exception {
int result = 0;
try {
result = x / y;
} finally {
System.out.println("kkkk");
}
return result;
}
public static void main(String[] args) {
try {
System.out.println(t(10, 0));
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("fianlly");
}
}
}
八、RuntimeException類
執行時異常,這種異常類最大特徵在於:程式在編譯的時候,不會強制性的要求使用者處理異常,使用者可以根據自己的需要選擇性處理,但是如果沒有處理又發生異常了,就會交給JVM預設處理,也就是說RuntimeException的子異常類,可以由使用者根據需要選擇進行處理
Exception與RuntimeException的區別:
Exception是RuntimeException的父類,使用exception定義的異常必須要被處理,而RuntimeException的異常可以選擇性處理
常見的RuntimeException異常:ArithmeticException,NullPointerException,ClassCastException
九、斷言–assert關鍵字
在java中斷言指的是程式執行到某行程式碼處時一定是預期的結果,預設情況下,斷言是不應該影響程式的執行的,也就是說在java編譯程式的時候,斷言是不起作用的
public class Main {
public static void main(String[] args) {
int num = 10;
//假設期望num是20
assert num == 20 : "num的內容不是20";
System.out.println("num=" + num);
}
}
輸出結果:10 (不報錯)
啟用斷言:java-ea 類名
十、自定義異常
java中已經提供了很多異常,但是在實際中異常往往不夠用,因此需要自定義一個異常類,如果想要自定義一個異常類,可以選擇繼承Exception類或者是RuntimeException類
class addException extends Exception {
public addException(String msg) {
super(msg);
}
}
public class Main {
public static void main(String[] args) {
int num = 20;
try {
if (num > 10) {
throw new addException("數值傳遞過大");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
報錯.addException: 數值傳遞過大
at 報錯.Main.main(Main.java:11)