我有一个问题,如果在创建枚举常量期间发生错误会发生什么? 也就是说我有一个枚举enum init错误
现在会发生什么,如果有损失init方法即连接错误,会枚举类型将被初始化还是什么?我应该在init方法中处理可能的错误并返回默认值,然后检查它是否为re init枚举常量?
我有一个问题,如果在创建枚举常量期间发生错误会发生什么? 也就是说我有一个枚举enum init错误
现在会发生什么,如果有损失init方法即连接错误,会枚举类型将被初始化还是什么?我应该在init方法中处理可能的错误并返回默认值,然后检查它是否为re init枚举常量?
现在会发生什么,如果在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对于http://ideone.com/我确实知道该服务! – luksch 2013-05-06 20:34:55
谢谢,你建议如何处理这种情况? – user2355990 2013-05-06 20:54:50
@ user2355990没有普遍的答案。这取决于故障模式的多样性和可恢复性。如果这是一个严重的,不可恢复的错误,那么你的应用程序应该会崩溃。 – 2013-05-06 21:05:57
的Java enum
只是一些自动生成的代码的类。所有枚举条目都是在加载类时启动的public final static
字段。如果在初始化期间引发异常,您将无法使用枚举:每次尝试访问它都会抛出异常。
顺便说一句,恕我直言,使用应该抛出异常枚举初始化的代码是一种不好的做法。你应该写枚举硬编码或使这个初始化懒惰或转换为普通类的枚举。
谢谢,所以如果我想为我的应用使用缓存等东西,枚举不是一个好的选择?我想将一个来自db的值与一个枚举常量相关联,然后在web应用中使用它,但是如果它在初始化期间可能会下降,我无法重新初始化它? – user2355990 2013-05-06 20:54:00
你可以添加一个getter到你的enum,它在第一次需要时从数据库检索值,并且缓存结果以供将来访问(又称懒惰初始化) – nicopico 2013-05-06 20:58:16
我会试试这个,看起来是一个很好的解决方案,谢谢你 – user2355990 2013-05-06 21:04:22
为什么你不测试它,看看? – 2013-05-06 20:30:57