[英]overridden method does not throw exception
我在編譯代碼時遇到問題,在某些條件下,我試圖使類的方法引發個性化異常。 但是在編譯時,我得到消息:
重寫的方法不會引發異常
這是類和異常聲明:
public class UNGraph implements Graph
Graph
是一個接口,其中包含UNGraph
所有方法(方法getId()
在該腳本上沒有throws
聲明)
在構造函數之后,我創建了異常(在類UNGraph中):
public class NoSuchElementException extends Exception {
public NoSuchElementException(String message){
super(message);
}
}
這是例外的方法
public int getId(....) throws NoSuchElementException {
if (condition is met) {
//Do method
return variable;
}
else{
throw new NoSuchElementException (message);
}
}
顯然,我不希望該方法每次都在不滿足條件的情況下拋出異常。 當它遇到時,我想返回一個變量。
編譯器發出錯誤是因為Java不允許您重寫方法並添加已檢查的Exception(擴展Exception
類的任何用戶定義的自定義異常)。 因為很明顯,您要處理未滿足某些條件的情況(意外發生)(錯誤),所以最好的選擇是拋出RuntimeException
。 RuntimeException
(例如: IllegalArgumentException
或NullPointerException
)不必包含在方法簽名中,因此可以減輕編譯器錯誤。
我建議對您的代碼進行以下更改:
//First: Change the base class exception to RuntimeException:
public class NoSuchElementException extends RuntimeException {
public NoSuchElementException(String message){
super(message);
}
}
//Second: Remove the exception clause of the getId signature
//(and remove the unnecessary else structure):
public int getId(....) {
if ( condition is met) { return variable; }
//Exception will only be thrown if condition is not met:
throw new NoSuchElementException (message);
}
當使用類和接口編寫如下代碼時,問題就變得很明顯:
Graph g = new UNGraph();
int id = g.getId(...);
Graph
接口沒有聲明它拋出了被檢查的異常NoSuchElementException
,因此編譯器將允許此代碼在沒有任何代碼的情況下使用try
塊或throws
子句。但是,重寫方法顯然可以拋出被檢查的異常; 它已經宣布了很多。 這就是為什么覆蓋方法不能拋出比覆蓋方法或抽象方法更多的檢查異常的原因。 根據對象的實際類型,調用代碼需要如何處理檢查的異常會有差異。
讓接口的方法聲明聲明它拋出NoSuchElementException
或者讓實現類的方法自己處理NoSuchElementException
。
如果要讓子類在該方法中引發檢查的異常,則必須在所有超類中為throws NoSuchElementException
檢查的異常聲明throws NoSuchElementException
。
您可以在Java Language Specification中閱讀更多內容:
11.2。 編譯時檢查異常
Java編程語言要求程序包含用於檢查異常的處理程序,這些異常可能是由於執行方法或構造函數而導致的。 對於每個可能的結果檢查異常,方法(第8.4.6節 )或構造函數(第8.8.5節 )的throws子句必須提及該異常的類或該異常的類的超類之一( 第§ 11.2.3 )。
這種檢查異常處理程序是否存在的編譯時檢查旨在減少未正確處理的異常的數量。 throws子句中命名的已檢查異常類(第11.1.1節 )是方法或構造函數的實現者與用戶之間的契約的一部分。 重寫方法的throws子句可能不指定此方法將導致拋出任何檢查的異常,而該異常將由其throws子句不允許拋出該覆蓋的方法(第8.4.8.3節 )。
當我在使用它時,您可能不應該使用NoSuchElementException
,因為它在JRE中使用了……請使用其他名稱。
這里 “異常與方法覆蓋在Java中處理”就是答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.