以下代码无法编译(“变量名称可能尚未初始化”):
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?
答案 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;
}
}