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结束吗?
答案 0 :(得分:3)
是的,它在任何情况下都会调用(如果在你的情况下它不是null)。根据java docs
当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。
如果您使用的是Java7,那么我强烈建议您使用try-with-resources Statement。然后您不需要在代码中编写 finally 块。
试用资源示例
try (BufferedReader bufferedReader =
new BufferedReader(new FileReader(new File(file,FILENAME)));) {
String readLine = bufferedReader.readLine();
//do stuff
} catch(Exception e) {
throw e;
}
注意:的
最后块只会在一种情况下执行。这是JVM关闭时(通常使用System.exit()
语句或JVM进程在外部被杀死)。在所有其他情况下, finally 保证执行
答案 1 :(得分:0)
最后总是执行,即使抛出异常也是如此。因此,当bufferedReader.close();
不为空
bufferedReader
答案 2 :(得分:0)
最后在try / catch块中意味着无论如何都会发生。 此外,异常将更好地声明为IOException。 在这种情况下,没有理由让catch块抛出异常。
注意:调用System.exit()确实会在遇到它时立即终止你的can,并导致应用程序被JVM(Java虚拟机)终止。
答案 3 :(得分:0)
我会推荐你这个问题:
In Java, is the "finally" block guaranteed to be called (in the main method)?
基本上,finally块总是会运行,但有一个例外:如果JVM在finally块执行之前退出。
关于bufferedReader是否正在执行 - 只要它不是null,是的,带有上述异常
答案 4 :(得分:0)
是的,此代码将在任何情况下关闭bufferedReader。但总的来说,代码看起来像一团糟。 Java 7 try-with-resources是关闭资源的最佳解决方案
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(file,FILENAME))) {
//do stuff
}