我有一个问题,如果在创建枚举常量期间发生错误会怎样? 即我有一个枚举
Enum statuses{
OPEN(1, init(1)), CLOSE(2, init(2));
private final int value;
private final int internalValue;
statuses(int v, int intv){
this.value = v;
this.internalValue = intv;
}
static int init(int value){
return get a value from db and return it;
}
}
现在如果在init方法中出现错误,即连接丢失,将会初始化枚举类型还是什么?我应该在init方法中处理可能的错误并返回默认值,然后检查它是否重新启动枚举常量?
答案 0 :(得分:3)
如果在init方法中出现错误,即连接丢失,将枚举类型将被初始化还是什么,会发生什么?
你会得到一个ExceptionInInitializerError
,你的程序(几乎可以肯定)会终止。
通过简单的测试,这很简单:
class Main
{
enum Statuses{
OPEN(1, init(1)), CLOSE(2, init(2));
private final int value;
private final int internalValue;
private Statuses(int v, int intv){
this.value = v;
this.internalValue = intv;
}
static int init(int value){
if (value == 2) throw new RuntimeException("this is a test");
return value;
}
}
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(Statuses.OPEN);
}
}
哪个输出:
Exception in thread "main" java.lang.ExceptionInInitializerError
at Main.main(Main.java:25)
Caused by: java.lang.RuntimeException: this is a test
at Main$Statuses.init(Main.java:18)
at Main$Statuses.<clinit>(Main.java:7)
... 1 more
答案 1 :(得分:1)
Java enum
只是一个包含一些自动生成代码的类。所有枚举条目都是在加载类时启动的public final static
字段。如果在初始化期间抛出异常,您将无法使用枚举:每次尝试访问它都会抛出异常。