Java: Создайте статического участника класса, конструктор которого мог выдать исключение

У меня есть статический метод set, который используется для установки всех экземпляров MyClass:

public class MyClass {  
        ....
    protected static final Setter setter = new Setter();
        ...
}

Однако это не компилирует, так как конструктор метода set выдает исключение:

public class Setter {

    public Setter() throws FileNotFoundException {
             ....
    }
}

Как я могу работать вокруг этого?

5
задан Péter Török 14 July 2010 в 14:27
поделиться

2 ответа

Ошибка ExceptionInInitializerError предназначена именно для этой цели. Вот релевантная цитата из связанной документации Javadoc:

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

Оберните назначение в блок статического инициализатора и обработайте его соответствующим образом.

public class MyClass {  
    protected static final Setter setter;

    static {
        try { 
            setter = new Setter();
        } catch (FileNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
    }
}
17
ответ дан 18 December 2019 в 08:26
поделиться

Вы можете создать его внутри статической функции, пока вы перехватываете исключение, которое она (потенциально) вызывает.

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;
    }
}
2
ответ дан 18 December 2019 в 08:26
поделиться
Другие вопросы по тегам:

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