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

时间:2010-08-22 23:29:05

标签: java enums constructor singleton

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

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

产生错误

  

未处理的异常类型IOException

3 个答案:

答案 0 :(得分:18)

因为实例是在静态初始值设定项中创建的,所以请改为抛出ExceptionInInitializerError。

答案 1 :(得分:3)

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

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。

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

答案 2 :(得分:0)

那种情况不起作用。

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

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

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

另外如果你想抛出一个IOException我假设你想要从文件中初始化一些东西,所以你应该考虑dynamic enums上的这篇文章。