2013-05-06 76 views
0

我有一个问题,如果在创建枚举常量期间发生错误会发生什么? 也就是说我有一个枚举enum init错误

​​

现在会发生什么,如果有损失init方法即连接错误,会枚举类型将被初始化还是什么?我应该在init方法中处理可能的错误并返回默认值,然后检查它是否为re init枚举常量?

+1

为什么你不测试它,看看? – 2013-05-06 20:30:57

回答

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 

http://ideone.com/YQ8FTB

+0

+1对于http://ideone.com/我确实知道该服务! – luksch 2013-05-06 20:34:55

+0

谢谢,你建议如何处理这种情况? – user2355990 2013-05-06 20:54:50

+0

@ user2355990没有普遍的答案。这取决于故障模式的多样性和可恢复性。如果这是一个严重的,不可恢复的错误,那么你的应用程序应该会崩溃。 – 2013-05-06 21:05:57

1

的Java enum只是一些自动生成的代码的类。所有枚举条目都是在加载类时启动的public final static字段。如果在初始化期间引发异常,您将无法使用枚举:每次尝试访问它都会抛出异常。

顺便说一句,恕我直言,使用应该抛出异常枚举初始化的代码是一种不好的做法。你应该写枚举硬编码或使这个初始化懒惰或转换为普通类的枚举。

+0

谢谢,所以如果我想为我的应用使用缓存等东西,枚举不是一个好的选择?我想将一个来自db的值与一个枚举常量相关联,然后在web应用中使用它,但是如果它在初始化期间可能会下降,我无法重新初始化它? – user2355990 2013-05-06 20:54:00

+0

你可以添加一个getter到你的enum,它在第一次需要时从数据库检索值,并且缓存结果以供将来访问(又称懒惰初始化) – nicopico 2013-05-06 20:58:16

+0

我会试试这个,看起来是一个很好的解决方案,谢谢你 – user2355990 2013-05-06 21:04:22

相关问题