Подтвердить что ты не робот

Как передать исключение из конструктора перечисления?

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

У меня есть случай, когда я хочу использовать перечисления в качестве ключей в некоторых классах настроек. В базе данных будет храниться строковое значение, что позволит нам изменять константы перечисления без необходимости обновлять базу данных (я знаю, что это немного уродливо). Я хотел добавить исключение времени выполнения в конструктор 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.

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

Ответ 3

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

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

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

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

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