Java: создание статического члена класса, конструктор которого может вызвать исключение - PullRequest
5 голосов
/ 14 июля 2010

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

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

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

public class Setter {

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

Какя могу обойти это?

Ответы [ 2 ]

17 голосов
/ 14 июля 2010

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

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

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

public class MyClass {  
    protected static final Setter setter;

    static {
        try { 
            setter = new Setter();
        } catch (FileNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
    }
}
2 голосов
/ 14 июля 2010

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

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...