Как вызвать исключение из конструктора enum? - PullRequest
11 голосов
/ 23 августа 2010

Как я могу вызвать исключение из конструктора enum? например:

public enum RLoader {
  INSTANCE;
  private RLoader() throws IOException {
   ....
  }
}

выдает ошибку

Необработанный тип исключения IOException

Ответы [ 3 ]

18 голосов
/ 23 августа 2010

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

3 голосов
/ 28 сентября 2011

У меня есть случай, когда я хочу использовать перечисления в качестве ключей в некоторых классах настроек. В базе данных будет храниться строковое значение, что позволит нам изменять константы перечисления без необходимости обновлять базу данных (я знаю, что это немного уродливо). Я хотел добавить исключение времени выполнения в конструктор enum как способ контролировать длину строкового аргумента, чтобы избежать попадания в базу данных, а затем получить нарушение ограничения, когда я сам мог легко его обнаружить.

public enum GlobalSettingKey {
    EXAMPLE("example");

    private String value;

    private GlobalSettingKey(String value) {
        if (value.length() > 200) {
            throw new IllegalArgumentException("you can't do that");
        }
        this.value = value;
    }

    @Override
    public String toString() {
        return value;
    }
}

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

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

0 голосов
/ 23 августа 2010

Этот сценарий не может работать.

Вы пытаетесь выбросить проверенный Exception из конструктора.

Этот конструктор вызывается объявлением записи перечисления INSTANCE, поэтому проверенное исключение не может быть обработано правильно.

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

Также, если вы хотите выбросить IOException Я предполагаю, что вы хотите инициализировать что-то из файла, поэтому вам, возможно, следует рассмотреть эту статью о динамических перечислениях .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...