为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 613 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信