我有一个静态setter,用于设置MyClass的所有实例:
public class MyClass {
....
protected static final Setter setter = new Setter();
...
}
但是由于setter构造函数抛出异常,因此无法编译:
public class Setter {
public Setter() throws FileNotFoundException {
....
}
}
我该如何解决这个问题?
答案 0 :(得分:17)
ExceptionInInitializerError
专为此目的而设计。以下是链接Javadoc的相关内容:
表示静态初始化程序中发生意外异常。抛出
ExceptionInInitializerError
表示在评估静态初始化程序或静态变量的初始化程序期间发生异常。
将赋值包装在静态初始化程序块中并进行相应处理。
public class MyClass {
protected static final Setter setter;
static {
try {
setter = new Setter();
} catch (FileNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}
}
答案 1 :(得分:2)
您可以在静态函数中创建它,只要您捕获异常它(可能)引发。
public class MyClass {
protected static final Setter setter = createSetter();
protected static Setter createSetter() {
try {
return new Setter();
} catch(FileNotFoundException e) {
// handle it appropriately
return null;
}
}
}
没有办法允许异常传播,因为它引发了一个已检查的异常(在初始化期间这是非法的)。有几种方法可以解决这个问题:
引发未经检查的异常:这会导致java.lang.ExceptionInInitializerError
在尝试加载类时引发。它可能令人困惑,难以跟踪和调试。我不推荐它。
将其更改为非最终变量,并创建一个访问它的函数:如果变量的非final,您可以检查它是否在get中设置,并提高检查异常,如果不是。这允许(实际上,要求)您的代码在其被调用的位置处理异常:
public class MyClass {
private static Setter setter;
protected static synchronized Setter getSetter() raises FileNotFoundException {
if setter == null {
setter = new Setter();
}
return setter;
}
}