異常體系以及try..catch,finally,throw,throws的使用
文章目錄
前言
首先,我們今天一起聊一下java中的異常體系
一、什麼是異常機制
首先,在Java中,當所寫程式碼不符合某些邏輯思想上規定,進而在JVM執行期間系統會自動將不符合邏輯的程式碼進行一系列的處理,從而使使用者可以及時去確定出現問題的位置
(換句話來說,當我們發現程式碼出現邏輯思想上的不規範時,我們是不是可以通過新增一些條件使邏輯不出錯,但會效能會降低,消耗也會增大,從而我們可以藉助異常類對其進行邏輯上的判斷和檢測)。
Throwable類中包含了異常(Exception類),和錯誤(Error類)
二、異常的分類
1.RuntimeException類 和 繼承Exception的其他子類
首先,所有的異常子類都繼承Exception父類
Java機制中,可分為RuntimeException類 和 繼承Exception的其他子類
常見的RuntimeException類的異常子類:
1.NullPointerException(空指標異常)
2.IndexOutOfBoundsException(下標超出異常)
3.IllegalArgumentException(引數不合法異常)
4.NumberFormatException(數字格式化異常)
5.ClassCastException(型別轉換異常)
6.ArithemticException(算術邏輯異常)
常見的繼承Exception類的其他子類:
1.SQLException
2.IOException
2.No Checked異常 和 Checked異常
No Checked異常:JVM可以進行簡單的處理,使得該類異常可以使用try…catch捕獲,throw丟擲異常
,也可以不用
No Checked異常:RuntimeException異常
Checked異常:該類異常必須要進行 throw丟擲異常和try…catch捕獲。
Checked異常:SQLException類 IOException類
三、try…catch , finally;throw;throws
1.try…catch 和 finally
try:用於儲存可能出現異常的程式碼
執行時,如果jvm檢測到程式碼異常,則建立一個和該異常相關的物件,並且程式碼的執行流程會跳過後面的try中的程式碼,進入catch塊中執行。
catch:進行捕獲異常,根據jvm建立的異常物件和catch塊中的異常型別進行匹配,成功則執行程式碼塊的內容。(利用 instanceof 運算子進行型別匹配)
finally:無論是否出現異常或return,都執行,除非在之前有System.exit(0)=>虛擬機器退出
在try…catch之外的程式碼,若沒有reuturn語句,則執行其程式碼;
public class Demo05 {
public static void main(String[] args) {
try {
int num1=12,num2=6;
int result=num1/num2;
System.out.printf("%d÷%d=%f\n",num1,num2,result);
String str=null;
System.out.println(str.length());
}catch(ArithmeticException ex){
System.out.println("除數不能為零");
ex.printStackTrace(); //列印當前異常的堆疊資訊
}catch(NullPointerException ex) {
System.out.println("不能訪問一個Null物件的方法哦");
//return;
//System.exit( 0);
}catch(IllegalFormatConversionException ex) {
System.out.println("注意格式化佔位符的對應關係鴨!");
}catch(Exception ex) {
System.out.println("哎喲,出錯了鴨!!!");
}finally {
System.out.println("finally.............");
}
System.out.println("程式結束");
}
}
2.throw 和 throws
快捷鍵:Alt+Shift+z
throws:將宣告異常型別丟擲到該方法名之後
throw:用於建立丟擲的異常物件,放於方法體內。
若丟擲的異常物件為No Checked異常,可以使用try…catch捕獲,throw丟擲異常,也可以不用
若丟擲的異常物件為Checked異常,必須使用try…catch捕獲,throw丟擲異常
public class Demo07 {
public static void main(String[] args) {
try {
dosth();
} catch (FileNotFoundException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
public static void dosth() throws FileNotFoundException{
int a=23,b=3;
if(a>b) {
throw new FileNotFoundException(); //No Checked異常
}
}
四 自定義丟擲
當系統的異常類不足以按照自己的想法去實現,則自定義丟擲可以解決這個問題
步驟:
1.建立一個自定義的異常類,並繼承某個父類,這裡繼承RuntimeException類,利用 super關鍵字,將引數傳入到父類進行一系列操作
2.利用throw建立一個自定義的異常型別物件,可以傳入引數,
3.使用throws將異常型別丟擲到該方法外
4.在主函式進行對異常的捕獲
注意:
1.若是自定義異常類繼承Exception,(No Check異常),可以處理該異常
2.若是自定義異常類繼承RuntimeException(Check異常),必須處理也可以不處理該異常
package com.apesource.exception;
public class Demo08 {
public static void main(String[] args) {
try {
donothing();
} catch (CountTooLargeException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
//自定義異常
public static void donothing() throws CountTooLargeException {
int count=9999;
if(count>999) {
//建立並丟擲自定義異常物件
//throw new CountTooLargeException(); //使用無參構造方法建立,採用預設提示資訊
throw new CountTooLargeException("商品數量過大"); //使用有參構造方法建立,採用自定義提示資訊
}
}
}
class CountTooLargeException extends RuntimeException{
public CountTooLargeException(String message) {
super(message);
}
上述就是今天的內容,讓我們一起學習,要是有不對的地方,還請大家幫忙指正呀。加油,兄弟們。