2013-10-20 39 views
5

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

但还是想知道是否有任何方式引发异常出初始化块的没有得到编译错误:我用的构造函数,而不是初始化块样解决了这个问题。谢谢:)

回答

9

初始化块只能引发未经检查的异常,或者检查所有构造函数声明要抛出的异常。 (这包括那些声明的子类的例外。)

您不能从没有声明构造函数的类的初始化程序中抛出检查的异常,因为您将实际提供一个无参数构造函数,该函数的参数为​​不会声明它抛出任何东西。

section 11.2.3 of the JLS

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

+0

+1 RuntimeExceptions或Errors,因为它们没有被选中。 –

+6

我不明白你如何阅读一个问题,写一个答案,并从规范中找到重要的引用,并在发布问题的同一分钟内做所有事情...... +1 – noone

+0

@noone Jon的练习多于大多数,永远不会少...;) –

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. 
     } 
    } 
} 

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

+0

这真的是“不要在家里尝试这个”的东西。 +1,因为学到了新东西:) – Batty

相关问题