我已经很清楚实例初始化器不能引发异常,因为它是对象初始化的一部分,并且开发人员无法控制此过程。 This post有相同的想法。

但是,我已经阅读了Bill Venners的一篇有关Java中的对象初始化的文章,并且引用了以下一段:

实例初始化器中的代码可能不会返回。除非使用匿名内部类,否则实例初始化器仅在类中每个构造函数的throws子句中显式声明了检查的异常时,才可以引发检查的异常。另一方面,匿名内部类中的实例初始化器可以引发任何异常。
请单击here以获取原始帖子。

似乎可以说实例初始化器会抛出异常。如果我的理解不正确,这里的任何人都可以向我解释一下或纠正我。

最佳答案

实例初始化器可以引发检查的异常,但是如果这样做,则类构造函数必须声明它们。例如,此代码是合法的:

import java.io.*;

public class MyClass {

    PrintStream stream;

    {
        stream = new PrintStream("/tmp/file.txt");
    }

    public MyClass() throws FileNotFoundException {
    }

}

但是,如果从构造函数中省略了throws子句,或者如果添加了另一个也没有该子句的构造函数,则该子句将无法编译,因为PrintStream构造函数会抛出FileNotFoundException

10-07 19:42
查看更多