初始化器块可以抛出异常吗?

时间:2013-10-20 14:38:01

标签: java

我在类中使用BufferedReader来读取文件。我试图在初始化块中初始化它。

class ReadFromFile
{
    BufferedReader br;

    {
        br = new BufferedReader(new FileReader(new File("file.txt")));
    }
}
初始化程序块中的

行抛出FileNotFoundException异常。所以,编译器给出了错误。我不想用try-catch块包围它。我通过使用构造函数而不是初始化块来解决问题,如:

class ReadFromFile
{
    BufferedReader br;

    public ReadFromFile() throws FileNotFoundException   
    {
        br = new BufferedReader(new FileReader(new File("file.txt")));
    }
}

但是仍然想知道是否有任何方法可以将异常从初始化块中抛出而不会出现编译错误。谢谢:))

2 个答案:

答案 0 :(得分:10)

初始化程序块只能抛出未经检查的异常,或者检查所有构造函数抛出的异常。 (这包括作为声明子类的子类的异常。)

您不能在没有声明构造函数的类中从初始化程序中抛出已检查的异常,因为您将有效地提供无参数构造函数,不会声明它会抛出任何内容。

来自section 11.2.3 of the JLS

  

如果命名类的实例变量初始值设定项或实例初始值设定项可以抛出已检查的异常类,除非在其类的每个构造函数的throws子句中显式声明该异常类或其一个超类,否则这是编译时错误并且该类至少有一个显式声明的构造函数。

答案 1 :(得分:1)

  

但是仍然想知道是否有任何方法可以将异常从初始化程序块中抛出而不会出现编译错误。

是的,但这是非常糟糕的主意。你可以这样做

class ReadFromFile {
    BufferedReader br;

    {
        try {
            br = new BufferedReader(new FileReader(new File("file.txt")));
        } catch(IOException ioe) {
            // there is a number of ways to blindly throw a checked exception.
            Thread.currentThread().stop(ioe); // don't try this at home.
        }
    }
}

这一切都是编译和工作,但它不必要地混淆。