亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java為什么不允許從靜態初始化塊中引發檢查異常?

Java為什么不允許從靜態初始化塊中引發檢查異常?

Helenr 2019-09-21 14:13:33
Java為什么不允許從靜態初始化塊中引發檢查異常?這個設計決定背后的原因是什么?
查看完整描述

3 回答

?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

因為無法在源中處理這些檢查的異常。您沒有對初始化過程的任何控制,并且無法從源代碼中調用static {}塊,因此可以用try-catch包圍它們。

因為您無法處理由檢查的異常指示的任何錯誤,所以決定禁止拋出檢查的異常靜態塊。

靜態塊不得引發已檢查的異常,但仍允許引發未檢查的/運行時異常。但是根據上述原因,您也將無法處理這些問題。

總而言之,此限制可防止(或至少使開發人員更難)構建可能會導致錯誤的應用程序無法恢復的東西。


查看完整回答
反對 回復 2019-09-21
?
慕標琳琳

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);

        }

    }

}


查看完整回答
反對 回復 2019-09-21
?
達令說

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(這是一個帶有“隱藏”靜態初始化程序的接口)將不得不拋出該異常或對其進行處理-接口處的異常處理?最好保持原樣。


查看完整回答
反對 回復 2019-09-21
  • 3 回答
  • 0 關注
  • 654 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號