Как я могу исключить исключение из конструктора enum? например:
public enum RLoader {
INSTANCE;
private RLoader() throws IOException {
....
}
}
вызывает ошибку
Необработанный тип исключения IOException
Как я могу исключить исключение из конструктора enum? например:
public enum RLoader {
INSTANCE;
private RLoader() throws IOException {
....
}
}
вызывает ошибку
Необработанный тип исключения IOException
Поскольку экземпляры создаются в статическом инициализаторе, вместо этого выкидывайте ExceptionInInitializerError.
У меня есть случай, когда я хочу использовать перечисления в качестве ключей в некоторых классах настроек. В базе данных будет храниться строковое значение, что позволит нам изменять константы перечисления без необходимости обновлять базу данных (я знаю, что это немного уродливо). Я хотел добавить исключение времени выполнения в конструктор 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.
Может быть, это глупо, но я думаю, что это вполне допустимый сценарий для исключения исключения в статическом инициализаторе.
Этот сценарий не может работать.
Вы пытаетесь выбросить проверенный Exception
из конструктора.
Этот конструктор вызывается объявлением записи перечисления INSTANCE
, поэтому проверенное исключение не может быть обработано правильно.
Также, на мой взгляд, это плохой стиль - генерировать исключения из конструктора, так как конструктор обычно не должен выполнять какую-либо работу и особенно не создавать ошибок.
Также, если вы хотите выбросить IOException
, я предполагаю, что вы хотите инициализировать что-то из файла, поэтому вам, возможно, следует рассмотреть эту статью о динамических перечислениях.