如何从枚举构造函数中抛出exception?

如何从枚举构造函数中抛出exception? 例如:

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

产生错误

未处理的exception类型IOException

因为实例是在静态初始化程序中创建的,所以抛出ExceptionInInitializerError。

我有一个案例,我想在一些设置类中使用枚举作为键。 数据库将存储一个字符串值,允许我们更改枚举常量而不必更新数据库(我知道有点难看)。 我想在枚举的构造函数中抛出一个运行时exception,作为一种警告字符串参数长度的方法,以避免命中数据库,然后在我自己可以轻松检测到它时获取约束违规。

 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; } } 

当我为此创建快速测试时,我发现抛出的exception不是我的,而是ExceptionInInitializerError。

也许这是愚蠢的,但我认为这是一个非常有效的场景,想要在静态初始化器中抛出exception。

那种情况不起作用。

您正在尝试从构造函数中抛出已检查的Exception

此构造函数由INSTANCE枚举条目声明调用,因此无法正确处理已检查的exception。

另外在我看来,从构造函数中抛出exception是不好的方式,因为构造函数通常不应该做任何工作,特别是不会创建错误。

此外,如果您想抛出IOException我假设您要从文件初始化某些内容,因此您应该考虑动态枚举上的这篇文章。