Почему Java не позволяет выбросить проверенное исключение из блока статической инициализации?

Почему Java не позволяет выбросить проверенное исключение из статического блока инициализации? В чем причина этого дизайнерского решения?

    Потому что невозможно обработать эти проверенные исключения в вашем источнике. У вас нет никакого контроля над процессом инициализации, и статические {} блоки не могут быть вызваны из вашего источника, чтобы вы могли окружить их попыткой.

    Поскольку вы не можете обработать какую-либо ошибку, отмеченную проверенным исключением, было решено запретить металирование проверенных исключений статических блоков.

    Статический блок не должен выставлять проверенные исключения, но все же допускает исключение исключенных / исключений времени выполнения. Но, согласно вышеприведенным причинам, вы также не сможете справиться с этим.

    Подводя итог, это ограничение не позволяет (или, по крайней мере, затрудняет) разработчика создавать что-то, что может привести к ошибкам, из которых приложение не сможет восстановить.

    Вы можете обойти проблему, поймав любое проверенное исключение и перевернув его как исключенное исключение. Этот неконтролируемый class исключений хорошо работает как shell: 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); } } } 

    Это должно было бы выглядеть так (это недопустимый код Java)

     // Not a valid Java Code static throws SomeCheckedException { throw new SomeCheckedException(); } 

    но как объявление, где вы его поймаете? Проверенные исключения требуют лова. Представьте себе некоторые примеры, которые могут инициализировать class (или могут не потому, что он уже инициализирован), и просто обратить внимание на сложность того, что он представит, и я приведу примеры в другой статичный инициализатор:

     static { try { ClassA a = new ClassA(); Class 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 (который является интерфейсом со «скрытым» статическим инициализатором) должен был бы выбросить исключение или обработать его – обработку исключений на интерфейсе? Лучше оставить это как есть.

    Взгляните на спецификации языка Java : указано, что это ошибка времени компиляции, если сбой статического инициализатора может завершиться внезапно с проверенным исключением.

    Поскольку никакой код, который вы пишете, не может вызвать статический блок инициализации, нецелесообразно бросать проверенные exceptions . Если бы это было возможно, что бы сделал jvm, когда были выбраны проверенные исключения? Runtimeexceptions распространяются вверх.

    Я могу скомпилировать бросок проверенного Исключения Также ….

     static { try { throw new IOException(); } catch (Exception e) { // Do Something } } 
    Давайте будем гением компьютера.