如何初始化ObjectName类型的静态final类成员?

时间:2014-03-05 13:52:25

标签: java jmx

以下代码无法编译(“变量名称可能尚未初始化”):

import javax.management.*;

public class Main {
    public final static ObjectName name;
    static {
        try {
            name = new ObjectName("abc");
        } catch (final Exception e) {
            System.exit(1);
        }   
    }   
}

但是,以下代码也不编译(“可能已经分配了变量名”):

import javax.management.*;

public class Main {
    public final static ObjectName name;
    static {
        try {
            name = new ObjectName("abc");
        } catch (final Exception e) {
            name = null;
            System.exit(1);
        }   
    }   
}

我不认为编译器对这两种情况都是正确的,但无论如何我们应该如何初始化一个静态的最终ObjectName?

3 个答案:

答案 0 :(得分:1)

第一条建议是不要致电System.exit() 。它导致应用程序突然退出,无需正常清理。

如果您绝对必须在该精确点退出应用程序,那么您的解决方法是添加

throw e; 
System.exit()来电后

如果您对编译器错误感到好奇,可能有兴趣在this question中阅读它。

答案 1 :(得分:1)

编译器期望在静态初始化程序块中的所有可能的执行分支ObjectName分配一个值。

static {
    try {
        name = new ObjectName("abc");
    } catch (final Exception e) {
        System.exit(1);
    }   
}   

由于ObjectName未在catch块中分配值, ,因为没有抛出异常,编译器不允许它。

如果catch块中抛出异常,则可以接受。

实现静态初始化程序块的alternative method,我更喜欢的是,块是对私有静态函数的简单调用:

static  {
   init();
}
   private static init()  {
      //do stuff
   }

答案 2 :(得分:0)

只需使用私有静态方法而不是静态初始化程序:

private static final ObjectName name = initObjectName();

private static ObjectName initObjectName() {
   try {
      return new ObjectName("abc");
   } catch (MalformedObjectNameException e) {
      return null;
   }
}