最后关闭连接和声明

时间:2013-08-07 22:30:28

标签: java jdbc connection try-catch 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();
        }
    }

5 个答案:

答案 0 :(得分:15)

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

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

  

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

答案 1 :(得分: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++));
            }
        }
    }

答案 2 :(得分:5)

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

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

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

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

这样做,您无需担心在finally块中明确关闭与数据库的链接,因为jvm会为您执行此操作。

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

答案 3 :(得分:0)

如果有可能是null,你必须检查一下。如果可能性不存在,则没有正当理由对其进行检查。

此外,通过省略一些单语句括号,可以使代码略微更易于阅读:

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

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

    } catch (SQLException sqlee) {
        sqlee.printStackTrace();
    }
}

答案 4 :(得分: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;
    }
}