6

我在一个类中使用 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")));
    }
}

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

4

2 回答 2

10

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

在没有声明构造函数的类中,您不能从初始化程序中抛出检查异常,因为您将有效地获得一个没有声明它抛出任何东西的无参数构造函数。

JLS 的第 11.2.3 节

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

于 2013-10-20T14:38:33.603 回答
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.
        }
    }
}

这一切都可以编译和工作,但它是不必要的混乱。

于 2013-10-20T14:41:58.683 回答