java代碼整潔之道(二)如何自定義異常

java代碼整潔之道(二)_如何自定義異常

首先解釋下java異常:當程序出現錯誤,異常給程序一個安全的退出,出現異常改變程序原有的流程,將控制權移交給異常處理器。

異常結構(類圖)

在這裏插入圖片描述throwable 的子類有兩個實現類Error,Exception ,throwable java指代的一種通過異常傳播機制的共性

1.其中ERROR 程序的無法處理的錯誤,和程序員日常編碼無關係的,它們在應用程序的控制和處理能力之外
如:VirtualMachineError 虛擬機錯誤,內存溢出 outOfMemoryError, 線程死鎖 ThreadDeath

2.其中Exception,是指程序可以處理的異常, 程序中的異常這個和程序員日常編碼息息相關

(1)運行時異常 runtimeException :怎麼解釋這個異常那,就是程序運行起來會發生的異常,換句話說就是程序不達到某種情況一輩子也可能拋不出來的異常,常見的運行時異常有(空指針異常 NullPointerException,數組下標越界異常 ArrayIndexOutOfBoundsException,算數異常 ArithmeticException, 類型轉換異常 ClassCastException),畫重點運行時異常的特點是Java 編譯器不會檢查它,即使不用try catch 語句捕獲它,它沒有throws 子語句聲明拋出它,它也能編譯通過的

(2)非運行時異常: 這個怎麼說,就是運行時異常之外的異常都是非運行時異常,如常見的異常 IO 異常 IOException類型轉換異常 ClassCastException畫重點必須顯示的try catch,或者throws


爲什麼要創建自己的異常,我的理由是這樣的
(1)業務代碼中常常需要阻斷流程,而且直接拋出throw new Exception() 也不合適。參考java 代碼整潔之道 中的短路寫法,用自定義異常很好的處理異常結果。
(2)處理一些非運行異常常導致try catch 漫天非,代碼非常不友好,用自定義異常能方便的進行非運行時異常運行時異常,方便異常的統一處理。
(3)自定義異常能更清楚的說明異常情況。


如何自定義異常

public class ServiceException extends  RuntimeException {

    public ServiceException(String msg){
        super(msg);
    }
}

上面的代碼繼承了RuntimeException ,當然繼承Exception 區別在與我在這想寫一個業務異常,runtimeException 不會顯現的throws 或者 try{}catch(){}

下面繼續完善我的業務自定義異常

public class ServiceException extends  RuntimeException {
    private int code;
    private String errorMsg;
    
    private ServiceException(String msg){
        super(msg);
    }
    
    public ServiceException(int code,String errorMsg ,String msg){
        super(msg);
        this.code = code;
        this.errorMsg = errorMsg;
    }

總結下: 當程序遇到業務類型異常流程是否可以採用自定義異常的方式退出那?和同事討論了半天,依然很艱難得出一個結果,心裏也糾結的要命,看一點源碼
ArrayList

 @Override
    public void forEach(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        final int expectedModCount = modCount;
        @SuppressWarnings("unchecked")
        final E[] elementData = (E[]) this.elementData;
        final int size = this.size;
        for (int i=0; modCount == expectedModCount && i < size; i++) {
            action.accept(elementData[i]);
        }
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }

其中 ConcurrentModificationException 就是一個RuntimeException , 觸發場景就是一個,當併發時 使得 modCount 和 expectedModCount 不等,用於退出程序
在此處可以看出來,這個異常用作不期待結果的退出。當業務也常是否可用業務的不期待結果(如 參數校驗失敗,結果不符合預期)的退出有待於考證。希望看到的同學給我解答. 諮詢了下以前的領導,似乎自己明白了,


要克服生活的焦慮和沮喪,得先學會做自己的主人,有問題留言,沒問題留下你的贊
博客聲明:
1.博客內容全是對工作學習的總結
2.知識點都經過測試和推敲,如有疑問請留言,一定及時解決

參考博客:
https://blog.csdn.net/qq_29229567/article/details/80773970

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章