[英]Throwing custom exceptions in Java versus built in exceptions
我有些困惑,因為我希望能夠在Java中引發自定義異常。 為此,我必須在函數的頭中添加throws MyException
。
然后,任何依次調用該函數的函數都必須添加throws MyException
或具有try-catch塊。 但為什么會這樣呢?
例如,當在Java中創建一個Stack並調用pop函數時,我不必具有try-catch,但是如果不存在Java語言,則Java中的pop方法會拋出NoSuchElementException
(或者是)。堆棧上的元素。
NoSuchElementException
是RuntimeException
(未經檢查的異常),我們不需要處理或聲明RuntimeException
S,因此編譯器不會抱怨,而是在運行時拋出它。
在檢查的異常,即,所有這一切都沒有亞型的例外情況RuntimeException
,編譯器會檢查是否有合適的catch
條款,從而使程序繼續執行過程中,執行中的操作后, catch
; 為此,您需要使用try/catch
塊處理它們或使用throws
子句聲明它們 - 將處理異常的責任委托給更高級的調用鏈。 如果您的自定義異常不是RuntimeException
檢查的異常規則也適用於您的自定義異常。
檢查異常--->由編譯器強制處理或傳播
未檢查的異常--->編譯器未檢查因此在運行時出現
Java有所謂的檢查異常和非檢查異常。 必須在方法簽名中聲明已檢查的異常,而無需聲明未檢查的異常。
如果要定義未檢查的異常,則可以從由Exception
插入的RuntimeException
派生它。
你應該拋出或嘗試捕獲所有已檢查的異常,它不是RunTimeException
必需的,而你所討論的異常是一個RuntimeException
請參閱我對這個問題的回答。
作為一般的經驗法則,在決定是否創建自定義異常類時,我嘗試盡可能多地使用內置異常類,這樣做有意義,例如IllegalArgumentException
等。
這是一個如何創建自定義RuntimeException
的示例,正如您所發現的那樣,它將不需要try/catch/finally
塊或throws
子句。
public class MyRuntimeException extends RuntimeException {
public MyRuntimeException() {
super();
}
public MyRuntimeException(String message) {
super(message);
}
}
public class MyClass {
public void go(int val) {
if(val <= 0) throw new MyRuntimeException("Val must be greater than 0.");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.