java - 我不会在finally block 中使用try-catch 语句。 (java)

标签 java stream garbage-collection connection try-catch-finally

这是一些java代码。

public class SomeClass {
private Connection connection;

public SomeClass(Connection c) {
    connection = c;
}
public void someWork(){
    Connection c;
    try {
        // do something
    } catch (Exception e) {
        // some exception code
    } finally {
        if (conn != null){
            try {c.close();} catch (Exception e) {}
        }
    }
}

}

但我不喜欢代码

if (conn != null){
        try {c.close();} catch (Exception e) {}
    }

所以我认为代码

...catch (Exception e) {
        // some exception code
    } finally {
        c = null;
    }

但我看到“流对象未收集垃圾。”

我不会在finally block 中使用try-catch语句。 请给我另一种方式。

最佳答案

只需创建一个静态实用方法:

private static void closeQuietly(final Connection conn)
{
    if (conn == null)
        return;
    try {
        conn.close();
    } catch (WhateverException ignored) {
    }
}

然后

conn = whatever(); // create it there, not in the try block
try {
    // work
} catch (WhateverException e) {
    // whatever
} finally {
    closeQuietly(conn);
}

但最终,您在finally block 中使用try/catch。

请注意,捕获异常是一个坏主意。而是捕获由 conn.close() 专门引发的异常。捕获Exception意味着您还捕获了所有RuntimeException;这是一件坏事。

如果你使用Guava,也可以使用Closeables.closeQuietly() ,它的作用与上面的代码几乎相同。您还可以查看Closer ,这很有趣。

最后(双关语):如果您使用 Java 7,请改用 try-with-resources 语句(请参阅 AutoCloseable ):

try (
    conn = whatever();
) {
    // ...
}

关于java - 我不会在finally block 中使用try-catch 语句。 (java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17209873/

相关文章:

javascript - 如何实现基本 Node Stream.Readable 示例?

c# - C# 析构函数的示例使用

java - java 堆中对象数量的增加可以作为指示吗?

java - 在 Java 中将远程文件通过 HTTP 转换为输入流

java - 在 Jboss 5.0 上启动 JSF 应用程序时出错

azure - SendGrid:如何从 Azure Blob 存储附加文件?

java - 如何计算 64 位 Java 内存成本

c - Ruby 垃圾回收 : Mark non-exported variables

Java 不断添加按钮! - JFrame -

java - 类扩展不止一个类Java?