我发现使用finally后“返回”代码的可能性,这里有一些例子:
int foo() {
BufferedReader br = ...;
try {
// cca 20 lines with 4 returns in different if-else clauses etc
//example:
if(something) {
return 0;
} else {
return 1;
}
} finally {
br.close();
}
}
(在我看来更懒惰)的交替性:
int foo() {
BufferedReader br = ...;
int toReturn;
// cca 20 lines with 4 ASSIGMENTS in different if-else clauses etc
//example:
if(something) {
toReturn = 0;
} else {
toReturn = 1;
}
br.close();
return toReturn;
}
所以,问题是,哪个更快,更具可读性,是的,在这种情况下,我真的关闭了一个BufferedReader,所以尝试finnaly为此还是我错误地使用它?
答案 0 :(得分:3)
如果不使用try/catch/finally
,如果抛出异常,您的BufferedReader
将无法正常关闭,导致内存泄漏,潜在的不需要的文件锁定......
使用finally
,即使在处理BufferedReader
数据块时抛出异常,您的try
也会被关闭。
但是,由于您的BufferedReader
实例化也会引发异常,您应该将其包含在try
块中:
BufferedReader br = null;
try {
br = ...;
// do your stuff
}
catch (Exception e) {
// handle exception
}
finally {
if(br != null)
br.close();
}
如果您使用的是Java 7或更高版本,请按照Arnaud的说明使用优雅的Try-with-resources。
答案 1 :(得分:1)
如果有exception
throws
,那么您的代码都会失败,因为第一种情况是您没有抓住exception
,而第二种情况则没有处理exception
的证据。
finally
将在此执行任何方式。
如果您的BufferedReader
按文件读取输入,则在两个文件都找不到的情况下无效。
答案 2 :(得分:1)
是的,你是的。如果说我用错了方法吗?
something
是方法调用并且它抛出异常,那么你的br永远不会关闭。虽然最终确保在任何情况下都会获得执行*
`* - 在某些条件下你可以避免最终的子句执行
答案 3 :(得分:1)
第二个实际上是不可接受的。如果发生异常,您不会关闭缓冲区。
我建议您使用 try-with-resources 语句(用于此目的):
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
//do what you want with the buffer. It will automatically be closed.
return;
}