天天看點

Java異常 --看這一篇就夠了!

文章目錄

      • Java異常
      • 1. 異常的分類
      • 2.處理異常
        • 2.1多catch語句捕捉
        • 2.2聲明異常
      • 3.抛出異常
      • 4.自定義異常
      • 總結

文章末尾附有知識點概括(思維導圖),有一定基礎者可直接浏覽!

Java異常

有的人認為,異常就代表的項目出現了“問題”,是負面的。但真的是這樣麼?下面來看個例子:

int a = null ;

int b = Integer.parseInt(a);

在一個系統中當遇到這種情況時,我們設想一下如果系統不報錯,哪會有什麼後果?此時的b值,應該為多少?

是以異常其實是一種“好事”,如果你合理利用的話。

1. 異常的分類

Java異常千千萬萬,但是可以粗略的分為兩類 Error 和 Exception:

  • Error:表示發生嚴重的錯誤,程式無法恢複,系統立即崩潰。如:
    • OOM(Out Of Memory Error):記憶體耗盡
    • Stack Overflow Error:棧溢出
  • Exception:表示程式發生了一些錯誤,但是可以不影響運作,系統不會立即崩潰。如:
    • ClassNotFoundException:為找到類異常
    • IOException:IO流異常

進階了解(初學者可以跳過,但以後要記得回來看):

Java中的異常也是類,父類 Throwable 派生出 Error 和 Exception,然後 Error 再派生出 OOM、Stack Overflow Error等等;

Exception類也是同理。如下圖

Java異常 --看這一篇就夠了!

Exception 派生出 兩大類 :

一種是邏輯上錯誤(RuntimeException),如文章開頭講的例子。這種情況應該修改一下代碼,不需要捕獲。

第二種就是很可能會發生的錯誤(checked Exception):例如當你使用IO讀取檔案時,很有可能發生錯誤,是以需要檢查。此時你必須捕獲,或者聲明異常。

2.處理異常

前面說了Exception “可以不影響運作”,如何做到勒?

答案就是捕獲異常。

捕獲異常 :try catch

try{
		// 需要捕獲代碼放在其中
	} catch(Exception e){ //   
		e.printStackTrace(); // 列印異常
	} finally {
     // 無論如何都會執行這段代碼       
     }
           
finally 語句可以省略

2.1多catch語句捕捉

如果使用上面這條語句捕獲異常的話,不論發生什麼異常都會被捕獲。

有的同學可能會說,那不是挺好的麼,異常都捕獲了。

我們前面已經講過 RuntimeException是不需要捕捉異常的,但是使用上這種方式則會捕獲Runtime Exception。

是以捕獲時,我們需要精确的異常的子類

當try塊中可能出現多條異常時,此時我們需要多catch語句捕捉異常,若 catch類出先父子類關系

子類catch 應該在 父類 catch 之前
try {
            test.send();
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // FileNotFoundException 是 IOException 的子類
           

2.2聲明異常

當然除了捕獲異常,你還可以在方法上聲明異常。

将捕獲異常的任務遞交至調用方,但最終都要捕獲這個異常

public void send() throws FileNotFoundException {
        FileInputStream input = new FileInputStream(new File("c://"));
    }
           
使用聲明異常,當發生異常時還是會使程式跳出運作
public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        Test test = new Test();
        test.send();

    }
    public void send() throws FileNotFoundException {
        FileInputStream input = new FileInputStream(new File("c://"));
    }
}
           

大家覺得這段程式會使程式中斷麼?

3.抛出異常

public class ThrowException {
    int[] ints = {1,3,4,5,6};
    public void increase(){
        try{
            int num = check(3); // 将參數改為2試試
            ints[num]++;
        }catch (RuntimeException e){
            e.printStackTrace();
        }
        System.out.println(Arrays.toString(ints));
    }
    public int check(int num){
        for (int i = 0; i < ints.length ; i++) {
            if (num == ints[i]) return i;
        }
        throw new RuntimeException("not num in ints");
    }

    public static void main(String[] args) {
        ThrowException throwException = new ThrowException();
        throwException.increase();
    }
}
           

看上面這個程式的優點:

  • 當出現錯誤時 程式能夠看到,你不需要再到處找bug
  • 出現異常也不會影響程式的運作

4.自定義異常

使用自定義異常,發生異常時可讀性更高,且适合不同業務場地開發。

自定義常用異常方法:

  1. 使用 BaseException繼承 合适的Exception,構造方法照抄父類構造方法
public class BaseException extends RuntimeException{
    public BaseException() {
        super();
    }
    public BaseException(String message) {
        super(message);
    }
    public BaseException(String message, Throwable cause) {
        super(message, cause);
    }

    public BaseException(Throwable cause) {
        super(cause);
    }

    protected BaseException(String message, Throwable cause,
                               boolean enableSuppression,
                               boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}
           
  1. 從 BaseException 上派生出 子類異常
public class NumNotInException extends BaseException{
    public NumNotInException() {
        super();
    }
    public NumNotInException(String message) {
        super(message);
    }
    public NumNotInException(String message, Throwable cause) {
        super(message, cause);
    }

    public NumNotInException(Throwable cause) {
        super(cause);
    }

    protected NumNotInException(String message, Throwable cause,
                            boolean enableSuppression,
                            boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}
           

然後便可以使用自定義異常了。

throw new NumNotInException(“have Exception”);

總結

直接用一張圖對今天的知識點進行概括

Java異常 --看這一篇就夠了!

若是覺得作者講的不錯可以點個贊,加個關注

我會持續更新喲!