Есть несколько проблем с вашим кодом:
У вас неверное имя исключения.Исключение, которое вы пытаетесь создать, называется ExceptionInInitializerError
, а не ExceptionInitializerError
.Это одна причина , почему он не будет компилироваться.
Никогда 1 throw Error
или подклассы Error
.
Если вам нужно сгенерировать непроверенное исключение, бросьте RuntimeException
.Или, что еще лучше, выберите что-то более конкретное или определите и используйте свой собственный класс исключений.
Это (вероятно) должен быть блок инициализатора static
, а не простой (экземпляр) инициализатор.Вы хотите, чтобы этот код выполнялся один раз ... не каждый раз, когда создается экземпляр SomeTest
.
Выход из блока инициализации static
то, что вы хотите избежать.Это в основном оставляет вас с мертвым приложением ... потому что включающий класс и любые классы, которые зависят от него, становятся неинициализируемыми.
Сказав это, следующий может будет более подходящей структурой:
static {
BlahType tmp = null;
label: {
for (...) {
if (...) {
tmp = ...;
break label;
}
}
throw new SomeException(...);
}
FINAL_VAR = tmp;
}
Обратите внимание, что нам нужно выполнить окончательное присвоение FINAL_VAR
таким образом, чтобы оно было точно назначено.(Я предполагаю, что это вторая причина, по которой вы получаете ошибки компиляции.)
И более естественный способ написать выше было бы:
static {
BlahType tmp = null;
for (...) {
if (...) {
tmp = ...;
break;
}
}
if (tmp == null) {
throw new SomeException(...);
}
FINAL_VAR = tmp;
}
1- Может быть, слишком сильно.Я бы сказал, что выбрасывание AssertionError
в порядке ... при условии, что вы намереваетесь , потому что его никогда не поймают / не восстановят.В этом случае восстановление в любом случае спорный.