如何从枚举构造函数抛出异常?例如:
public enum RLoader { INSTANCE; private RLoader() throws IOException { .... } }
产生误差未处理的异常类型IOException
2uluyalo1#
因为示例是在静态初始化器中创建的,所以抛出ExceptionInInitializerError。
ExceptionInInitializerError
throw new ExceptionInInitializerError();
mwkjh3gx2#
我有一个例子,我想使用枚举作为一些设置类的键。数据库将存储一个字符串值,允许我们更改枚举常量,而不必更新数据库(有点丑,我知道)。我想在枚举中引发运行时异常。的构造函数作为一种控制字符串参数长度的方法,以避免命中数据库,然后在可能时得到约束冲突我自己也能轻易察觉。
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。也许这很愚蠢,但我认为这是在静态初始化器中抛出异常的一个相当有效的场景。
n6lpvg4x3#
这种情况行不通。您正在尝试从构造函数中引发已检查的Exception。此构造函数由INSTANCE枚举项声明调用,因此无法正确处理选中的异常。另外,在我看来,从构造函数中抛出异常是不好的,因为构造函数通常不应该做任何工作,尤其是不应该产生错误。另外,如果您想抛出一个IOException,我假设您想从文件初始化一些东西,所以您可能应该考虑关于dynamic enums的本文。
Exception
INSTANCE
IOException
3条答案
按热度按时间2uluyalo1#
因为示例是在静态初始化器中创建的,所以抛出
ExceptionInInitializerError
。mwkjh3gx2#
我有一个例子,我想使用枚举作为一些设置类的键。数据库将存储一个字符串值,允许我们更改枚举常量,而不必更新数据库(有点丑,我知道)。我想在枚举中引发运行时异常。的构造函数作为一种控制字符串参数长度的方法,以避免命中数据库,然后在可能时得到约束冲突我自己也能轻易察觉。
当我为此创建一个快速测试时,我发现抛出的异常不是我的,而是一个ExceptionInInitializerError。
也许这很愚蠢,但我认为这是在静态初始化器中抛出异常的一个相当有效的场景。
n6lpvg4x3#
这种情况行不通。
您正在尝试从构造函数中引发已检查的
Exception
。此构造函数由
INSTANCE
枚举项声明调用,因此无法正确处理选中的异常。另外,在我看来,从构造函数中抛出异常是不好的,因为构造函数通常不应该做任何工作,尤其是不应该产生错误。
另外,如果您想抛出一个
IOException
,我假设您想从文件初始化一些东西,所以您可能应该考虑关于dynamic enums的本文。