Java:创建静态类成员,其构造函数可以抛出异常

时间:2010-07-14 14:21:34

标签: java exception static constructor

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

public class MyClass {  
        ....
    protected static final Setter setter = new Setter();
        ...
}

但是由于setter构造函数抛出异常,因此无法编译:

public class Setter {

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

我该如何解决这个问题?

2 个答案:

答案 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;
    }
}