首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >枚举初始化出错

枚举初始化出错
EN

Stack Overflow用户
提问于 2013-05-07 04:30:09
回答 2查看 1.6K关注 0票数 0

我有一个问题,如果在创建枚举常量的过程中发生错误,会发生什么?例如,我有一个枚举

代码语言:javascript
运行
复制
 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方法中可能的错误并返回默认值,然后检查它是否为re init enum常量?

EN

回答 2

Stack Overflow用户

发布于 2013-05-07 04:33:20

现在,如果初始化方法中出现错误,即连接丢失,将初始化枚举类型还是其他什么?

您将获得一个ExceptionInInitializerError,并且您的程序将(几乎肯定地)终止。

这很容易通过一个简单的测试来回答:

代码语言:javascript
运行
复制
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);
        }
}

以下哪项输出:

代码语言:javascript
运行
复制
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

票数 3
EN

Stack Overflow用户

发布于 2013-05-07 04:36:08

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

顺便说一句,使用本应在枚举初始化中抛出异常的代码是一种不好的做法。您应该编写硬编码的枚举,或者使这种初始化变得懒惰,或者将枚举转换为普通类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16406762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档