-2
try {
        bufferedReader = new BufferedReader(new FileReader(new File(file,FILENAME)));
        String readLine = bufferedReader.readLine();
        //do stuff

    } catch(Exception e) {
        throw e; 
    } finally {
        if (bufferedReader!=null)
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
}

在此代码中是否会在任何情况下调用 bufferedReader 关闭?

4

5 回答 5

3

是的,它在任何情况下都会调用(如果在你的情况下它不为空)。根据 java文档

finally 块总是在 try 块退出时执行。这样可以确保即使发生意外异常也会执行 finally 块。但 finally 不仅仅对异常处理有用——它允许程序员避免清理代码意外地被 return、continue 或 break 绕过。将清理代码放在 finally 块中始终是一个好习惯,即使没有预料到异常也是如此。

如果您使用的是 Java7,那么我强烈建议您使用try-with-resources 语句。那么您不需要在代码中编写finally块。

尝试资源示例

     try (BufferedReader  bufferedReader = 
             new BufferedReader(new FileReader(new File(file,FILENAME)));) {
              String readLine = bufferedReader.readLine();
              //do stuff   
      } catch(Exception e) {
           throw e; 
     } 

注意: finally块仅在一种情况下不会执行。那是JVM关闭的时候(一般是withSystem.exit()语句或者JVM进程被外部杀死的时候)。在所有其他情况下,finally保证执行

于 2013-08-07T18:24:34.460 回答
0

finally 总是被执行,无论是否抛出异常。所以它会执行bufferedReader.close();whenbufferedReader不为null

于 2013-08-07T18:24:26.147 回答
0

finally 在 try/catch 块中意味着无论如何它都会发生。此外,最好将异常表述为 IOException。在这种情况下,确实没有理由让 catch 块抛出异常。

注意:调用 System.exit() 确实会在遇到它时立即终止您的操作,并导致应用程序被 JVM(Java 虚拟机)终止。

于 2013-08-07T18:24:43.170 回答
0

我会向您推荐这个问题:

在 Java 中,是否保证调用“finally”块(在 main 方法中)?

基本上,finally 块总是会运行,但有一个例外:如果 JVM 在 finally 块执行之前退出。

至于bufferedReader是否执行——如所写,只要不为null,是的,除了上面提到的异常

于 2013-08-07T18:25:22.600 回答
0

是的,此代码将在任何情况下关闭 bufferedReader。但总的来说,代码看起来很乱。Java 7 try-with-resources 是关闭资源的最佳解决方案

try (BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(file,FILENAME))) {
   //do stuff
}
于 2013-08-07T18:32:40.747 回答