Java:创建静态类成员,其构造函数可能引发异常

Java:创建静态类成员,其构造函数可能引发异常,java,exception,static,constructor,Java,Exception,Static,Constructor,我有一个静态setter,用于设置MyClass的所有实例: public class MyClass { .... protected static final Setter setter = new Setter(); ... } 但是,这不会编译,因为setter构造函数引发异常: public class Setter { public Setter() throws FileNotFoundException {

我有一个静态setter,用于设置MyClass的所有实例:

public class MyClass {  
        ....
    protected static final Setter setter = new Setter();
        ...
}
但是,这不会编译,因为setter构造函数引发异常:

public class Setter {

    public Setter() throws FileNotFoundException {
             ....
    }
}

我怎样才能解决这个问题

只要捕获它(可能)引发的异常,就可以在静态函数中创建它

无法允许异常传播,因为它会引发已检查的异常(在初始化期间这是非法的)。有几种方法可以解决这个问题:

  • 引发未经检查的异常:这会导致在尝试加载类时引发
    java.lang.ExceptionInInitializerError
    。它可能会令人困惑,并且难以跟踪和调试。我不推荐

  • 将其更改为非最终变量,并创建一个函数来访问它:如果该变量是非最终变量,您可以检查它是否在get中设置,如果不是,则引发选中的异常。这允许(实际上需要)您的代码在调用异常时处理异常:


正是为了这个目的而设计的。以下是链接的Javadoc中的相关引用:

表示静态初始值设定项中发生意外异常。抛出一个
ExceptionInInitializerError
,指示在计算静态初始值设定项或静态变量初始值设定项期间发生异常

将赋值包装在静态初始值设定项块中,并相应地进行处理

public class MyClass {  
    protected static final Setter setter;

    static {
        try { 
            setter = new Setter();
        } catch (FileNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
    }
}

通常,如果某个对象抛出选中的异常,则它不是您希望存储在静态中的对象。@sixtyfootersdude:将其包装在未选中的异常中。
public class MyClass {
    private static Setter setter;

    protected static synchronized Setter getSetter() raises FileNotFoundException {
        if setter == null {
            setter = new Setter();
        }

        return setter;
    }
}
public class MyClass {  
    protected static final Setter setter;

    static {
        try { 
            setter = new Setter();
        } catch (FileNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
    }
}