У меня есть статический метод set, который используется для установки всех экземпляров MyClass:
public class MyClass {
....
protected static final Setter setter = new Setter();
...
}
Однако это не компилирует, так как конструктор метода set выдает исключение:
public class Setter {
public Setter() throws FileNotFoundException {
....
}
}
Как я могу работать вокруг этого?
Ошибка ExceptionInInitializerError
предназначена именно для этой цели. Вот релевантная цитата из связанной документации Javadoc:
Сигнализирует, что в статическом инициализаторе возникла непредвиденная исключительная ситуация.
ExceptionInInitializerError
выдается, чтобы указать, что исключение произошло во время оценки статического инициализатора или инициализатора для статической переменной.
Оберните назначение в блок статического инициализатора и обработайте его соответствующим образом.
public class MyClass {
protected static final Setter setter;
static {
try {
setter = new Setter();
} catch (FileNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}
}
Вы можете создать его внутри статической функции, пока вы перехватываете исключение, которое она (потенциально) вызывает.
public class MyClass {
protected static final Setter setter = createSetter();
protected static Setter createSetter() {
try {
return new Setter();
} catch(FileNotFoundException e) {
// handle it appropriately
return null;
}
}
}
Не существует способа разрешить распространение исключения, поскольку оно вызывает проверенное исключение (а это недопустимо во время инициализации). Есть несколько способов справиться с этим:
Вызвать непроверенное исключение : это вызывает ошибку java.lang.ExceptionInInitializerError
, когда он пытается загрузить класс. Это может сбивать с толку, и его сложно отследить и отладить. Не рекомендую.
Измените ее на не конечную переменную и создайте функцию для доступа к ней : Если переменная не конечная, вы можете проверить, установлена ли она в get, и вызвать отмеченное исключение, если это не так. Это позволяет (действительно требует), чтобы ваш код обрабатывал исключение в точке его вызова:
public class MyClass {
private static Setter setter;
protected static synchronized Setter getSetter() raises FileNotFoundException {
if setter == null {
setter = new Setter();
}
return setter;
}
}