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

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

128
задан Raedwald 19 January 2016 в 08:41
поделиться

4 ответа

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

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

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

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

113
ответ дан 24 November 2019 в 00:39
поделиться

Это должно было бы выглядеть так (это не Действительный код 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 (который является интерфейсом с «скрытым» статическим инициатором), придется бросить исключение или обрабатывать его - обращение с исключением на интерфейсе? Лучше оставить это как есть.

20
ответ дан 24 November 2019 в 00:39
поделиться

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

4
ответ дан 24 November 2019 в 00:39
поделиться

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

2
ответ дан 24 November 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: