-1

我发现使用 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,所以是 try-finnaly 还是我使用错误的方式?

4

4 回答 4

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 或更新版本,请使用优雅的Try-with-resources,如 Arnaud 所述。

于 2013-09-11T12:27:53.453 回答
1

如果有exception throws,你的代码都失败了,因为第一种情况你exception没有发现,第二种情况没有处理的证据exception

finally将在这里执行任何方式。

如果您BufferedReader通过文件读取获取输入,那么在两种方式都找不到哪个文件的情况下,这没有用。

于 2013-09-11T12:27:14.167 回答
1

我用错了吗?

是的,你是。如果说something是一个方法调用并且它抛出异常,那么你的 br 永远不会关闭。虽然 finally 确保在任何情况下它都会被执行*

`* - 在某些情况下可以避免 finally 子句执行

于 2013-09-11T12:27:28.920 回答
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;
}

请参阅try-with-resources 声明

于 2013-09-11T12:28:34.657 回答