相关疑难解决方法(0)

尝试捕获比尝试资源更多或更少昂贵

我刚刚开始回到Java并且从未有机会使用它try-with-resources.从表面上看,它看起来很棒,因为它可以减少代码,但在引擎盖下它是否比传统的操作或多或少昂贵的操作try-catch?我知道try-catch已经是一个昂贵的操作,因此我的好奇心.

我给这两种类型做了一个简单的测试,并没有发现任何差别:

测试实例

尝试资源测试

long startTime = System.currentTimeMillis();
ArrayList<String> list = null;

try (Scanner sc = new Scanner(new File("file.txt"))) {
    list = new ArrayList();
    while (sc.hasNext()) {
        list.add(sc.next());
    }
} catch (Exception ex) {
    System.err.println("Error: " + ex.getMessage());
} finally {
    long endTime = System.currentTimeMillis();
    System.out.println("The program completed in " + (endTime - startTime) + " ms");
}
Run Code Online (Sandbox Code Playgroud)

传统的Try-Catch测试

long startTime = System.currentTimeMillis();
ArrayList<String> list = null;
Scanner sc = null;

try { …
Run Code Online (Sandbox Code Playgroud)

java exception-handling

19
推荐指数
2
解决办法
2480
查看次数

如何正确关闭资源

当我清理一些代码时,FindBugs向我指出了一些使用Connection,CallableStatement和ResultSet对象的JDBC代码.这是该代码的片段:

CallableStatement cStmt = getConnection().prepareCall("...");
...
ResultSet rs = cStmt.executeQuery();

while ( rs.next() )
{
    ...
}

cStmt.close();
rs.close();
con.close();
Run Code Online (Sandbox Code Playgroud)

FindBugs指出这些应该在finally块中.我开始重构我的代码来执行此操作,我开始想知道如何处理finally块中的代码.

创建CallableStatement的Connection对象可能会抛出异常,将ResultSet对象保留为null.当我尝试关闭ResultSet时,我会得到一个NullPointerException,反过来,我的Connection将永远不会被关闭.实际上,这个线程提出了相同的概念,并表明将close()调用包装在null检查中是个好主意.

但是其他可能的例外呢?根据Java API规范,如果发生数据库错误,Statement.close()可以抛出SQLException.因此,即使我的CallableStatement不为null并且我可以在其上成功调用close(),我仍然可能会得到一个异常并且没有机会关闭我的其他资源.

我能想到的唯一"故障安全"解决方案是将每个close()调用包装在自己的try/catch块中,如下所示:

finally {

    try {
        cStmt.close();
    } catch (Exception e) { /* Intentionally Swallow  Exception */ }

    try {
        rs.close();
    } catch (Exception e) { /* Intentionally Swallow  Exception */ }

    try {
        con.close();
    } catch (Exception e) { /* Intentionally Swallow  Exception */ }

}
Run Code Online (Sandbox Code Playgroud)

男孩,如果那看起来不太可怕.有没有更好的方法来解决这个问题?

java jdbc

18
推荐指数
2
解决办法
2万
查看次数

在Java 7中关闭ResultSet

以下站点显示了使用JDBC的新"AutoClosable"功能:link.此站点显示了语句将如何自动关闭,但结果集不在try()部分中,它将自动关闭.所以,我的问题是,我不需要直接在Java 7中关闭ResultSet吗?我一直使用模式:close resultset,close语句,close连接.

java jdbc

7
推荐指数
1
解决办法
3567
查看次数

标签 统计

java ×3

jdbc ×2

exception-handling ×1