枚举初始化错误

时间:2013-05-06 20:30:09

标签: java error-handling static enums init

我有一个问题,如果在创建枚举常量期间发生错误会怎样? 即我有一个枚举

 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方法中处理可能的错误并返回默认值,然后检查它是否重新启动枚举常量?

2 个答案:

答案 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

http://ideone.com/YQ8FTB

答案 1 :(得分:1)

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

使用应该将异常抛入枚举初始化的代码,BTW恕我直言是一种不好的做法。你应该写enum硬编码或使这个初始化延迟或将枚举转换为普通类。