我已经非常清楚实例初始化器不能抛出异常,因为它是对象初始化的一部分,并且开发人员无法控制此过程。 This post也有同样的想法。
但是,我已经阅读了Bill Venners关于java中对象初始化的文章,并引用了一个段落如下:
实例初始值设定项中的代码可能无法返回。除了匿名内部类的情况之外,只有在类中每个构造函数的throws子句中显式声明了已检查的异常时,实例初始值设定项才可以抛出已检查的异常。另一方面,匿名内部类中的实例初始值设定项可以抛出任何异常。 请点击here获取原始帖子。
似乎说实例初始值设定项可以抛出异常。如果我的理解不正确,有人可以在这里向我解释或纠正我。
答案 0 :(得分:2)
实例初始值设定项可以抛出已检查的异常,但如果有,则类构造函数必须声明它们。例如,此代码是合法的:
import java.io.*;
public class MyClass {
PrintStream stream;
{
stream = new PrintStream("/tmp/file.txt");
}
public MyClass() throws FileNotFoundException {
}
}
但是,如果构造函数中省略了throws
子句,或者添加了另一个没有该子句的构造函数,则无法编译,因为PrintStream
构造函数抛出{{ 1}}。