8

哪个更适合 finally 块:

finally {
        try {
            con.close();
            stat.close();
        } catch (SQLException sqlee) {
            sqlee.printStackTrace();
        }
    }

或者:

finally {
        try {
            if (con != null) {
                con.close();
            }
            if (stat != null) {
                stat.close();
            }
        } catch (SQLException sqlee) {
            sqlee.printStackTrace();
        }
    }
4

5 回答 5

17

更好的使用方法是第二种,因为如果在初始化时抛出异常conor stat,它们将不会被初始化,并且可能会被初始化为null. 在这种情况下,使用第一个代码将抛出NullPointerException.

此外,如果您已经在使用Java 7,则应该考虑使用try-with-resources,它会自动关闭资源。从链接的教程:

try-with-resources 语句确保每个资源在语句结束时关闭。任何实现 java.lang.AutoCloseable 的对象,包括所有实现 java.io.Closeable 的对象,都可以用作资源。

于 2013-08-07T22:32:44.323 回答
7

他们都不够好。用这个:

public static void closeQuietly(AutoCloseable ... closeables) {
    for (AutoCloseable c : closeables) {
        if (c != null) {
            try {
                c.close();
            } catch (Exception e) {
                // log or ignore, we can't do anything about it really
            }
        }
    }
}

并称它为closeQuietly(stat, con);

或使用 java 7 的try-with-resource

    List<String> results = new ArrayList<>();
    try (Statement statement = conn.createStatement();
         ResultSet rs = statement.executeQuery(query)) {

        int numberOfColumns = getColumnCount(rs);
        while (rs.next()) {
            int i = 1;
            while (i <= numberOfColumns) {
                results.add(rs.getString(i++));
            }
        }
    }
于 2013-08-07T22:37:14.997 回答
6

从 Java 7 开始,您不再需要使用 finallyl 块来关闭 Connection 或 Statement 对象。相反,您可以使用名为“try-with-resources”的新功能。

首先,您使用 try-catch 块的新语法声明 Connection 和 Stament 对象,如下所示:

try(Connection con =  DriverManager.getConnection(database-url, user, password); Statement st = conn.createStatement()) {

 //your stuffs here
} catch (SQLException e) {
   e.printStackTrace();
}    

这样做,您无需担心在 finally 块中显式关闭与数据库的链接,因为 jvm 会为您完成。

有很好的编码......

于 2013-08-07T22:43:59.020 回答
0

如果有可能,则null必须检查。如果不存在这种可能性,则没有正当理由进行检查。

此外,您可以通过省略一些单语句括号来使您的代码更具可读性:

finally {
    try {
        if (con != null)
            con.close();

        if (stat != null)
            stat.close();

    } catch (SQLException sqlee) {
        sqlee.printStackTrace();
    }
}
于 2013-08-07T22:32:33.800 回答
0

我会选择第二个选项,但添加第二个嵌套finally块,只是为了确保constat对象都被标记为垃圾收集:

finally {
    try {
        if(con != null)
            con.close();
        if(stat != null)
            stat.close();
    } catch(SQLException sqlee) {
        sqlee.printStackTrace();
    } finally {  // Just to make sure that both con and stat are "garbage collected"
        con = null;
        stat = null;
    }
}
于 2013-08-07T22:35:10.437 回答