【问题标题】:Java: Create static class member whose constructor could throw an exceptionJava:创建其构造函数可能引发异常的静态类成员
【发布时间】:2011-03-15 21:26:28
【问题描述】:

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

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

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

public class Setter {

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

我该如何解决这个问题?

【问题讨论】:

  • 一般来说,如果某些东西抛出了一个已检查的异常,它不是你想要存储在静态中的东西。

标签: java exception static constructor


【解决方案1】:

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

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变量,并创建一个函数来访问它:如果变量是非final的,您可以检查它是否在get中设置,并引发如果不是,则检查异常。这允许(实际上,需要)您的代码在调用它的地方处理异常:


public class MyClass {
    private static Setter setter;

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

        return setter;
    }
}

【讨论】:

  • @sixtyfootersdude:将其包装在未经检查的异常中。
【解决方案2】:

ExceptionInInitializerError 正是为此目的而设计的。以下是来自链接的 Javadoc 的相关引用:

表示静态初始化程序中发生了意外异常。抛出 ExceptionInInitializerError 表示在计算静态初始化程序或静态变量初始化程序期间发生了异常。

将赋值封装在静态初始化块中并进行相应处理。

public class MyClass {  
    protected static final Setter setter;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2010-09-29
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多