3 回答

TA貢獻1995條經驗 獲得超2個贊
因為無法在源中處理這些檢查的異常。您沒有對初始化過程的任何控制,并且無法從源代碼中調用static {}塊,因此可以用try-catch包圍它們。
因為您無法處理由檢查的異常指示的任何錯誤,所以決定禁止拋出檢查的異常靜態塊。
靜態塊不得引發已檢查的異常,但仍允許引發未檢查的/運行時異常。但是根據上述原因,您也將無法處理這些問題。
總而言之,此限制可防止(或至少使開發人員更難)構建可能會導致錯誤的應用程序無法恢復的東西。

TA貢獻1830條經驗 獲得超9個贊
您可以通過捕獲任何已檢查的異常并將其作為未檢查的異常重新拋出來解決該問題。這個未經檢查的異常類可以很好地用作包裝器:java.lang.ExceptionInInitializerError。
樣例代碼:
protected static class _YieldCurveConfigHelperSingleton {
public static YieldCurveConfigHelper _staticInstance;
static {
try {
_staticInstance = new YieldCurveConfigHelper();
}
catch (IOException | SAXException | JAXBException e) {
throw new ExceptionInInitializerError(e);
}
}
}

TA貢獻1821條經驗 獲得超6個贊
它將看起來像這樣(這不是有效的Java代碼)
// Not a valid Java Code
static throws SomeCheckedException {
throw new SomeCheckedException();
}
但是在哪里抓廣告呢?已檢查的異常需要捕獲。想象一些可能初始化該類的示例(或者可能不會因為已經初始化該類),并且只是為了引起人們對其引入的復雜性的注意,我將這些示例放在另一個靜態初始化器中:
static {
try {
ClassA a = new ClassA();
Class<ClassB> clazz = Class.forName(ClassB.class);
String something = ClassC.SOME_STATIC_FIELD;
} catch (Exception oops) {
// anybody knows which type might occur?
}
}
還有一件令人討厭的事情-
interface MyInterface {
final static ClassA a = new ClassA();
}
想象一下ClassA的靜態初始化程序拋出了一個已檢查的異常:在這種情況下,MyInterface(這是一個帶有“隱藏”靜態初始化程序的接口)將不得不拋出該異常或對其進行處理-接口處的異常處理?最好保持原樣。
添加回答
舉報