Почему Java не позволяет бросать контролируемую исключительную ситуацию от статического блока инициализации? Какова была причина позади этого проектного решения?
Потому что невозможно обрабатывать эти проверенные исключения в вашем источнике. У вас нет контроля над процессом инициализации, а статические блоки {} не могут быть вызваны из вашего источника, чтобы вы могли окружить их с помощью Try-Chav.
Поскольку вы не можете обрабатывать какую-либо ошибку, указанную проверенным исключением, было решено запретить бросать проверенные исключения статические блоки.
Статический блок не должен бросать , проверен исключения . Но согласно вышеуказанным причинам, вы не сможете справиться с этим.
Чтобы обобщить, это ограничение предотвращает (или, по крайней мере, затрудняет) разработчик от создания чего-либо, что может привести к ошибкам, из которых приложение не сможет восстановить.
Это должно было бы выглядеть так (это не Действительный код 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();
}
Представьте, что имел статический инициализатор, бросающий проверенное исключение: в этом случае myInterface (который является интерфейсом с «скрытым» статическим инициатором), придется бросить исключение или обрабатывать его - обращение с исключением на интерфейсе? Лучше оставить это как есть.
Взгляните на Характеристики языка Java : указывается, что это ошибка времени компиляции, если статический инициализатор не удается , может выполняться резко с проверенным исключением с проверкой Отказ
Поскольку нет код, который вы пишете, может вызывать статический блок инициализации, бесполезно выбрасывать проверенные исключения
. Если бы это было возможно, что бы jvm делал, когда выбрасывались проверенные исключения? Исключения времени выполнения
распространяются вверх.