0

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

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

4

2 回答 2

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

于 2013-05-06T20:33:20.427 回答
1

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

顺便说一句,恕我直言,使用应该在枚举初始化中引发异常的代码是一种不好的做法。您应该编写 enum 硬编码或使此初始化惰性或将 enum 转换为普通类。

于 2013-05-06T20:36:07.510 回答