返回后使用try - finally返回java的lazy代码

时间:2013-09-11 12:24:02

标签: java return try-finally

我发现使用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为此还是我错误地使用它?

4 个答案:

答案 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;
}

请参阅The try-with-resources Statement