最终阻止哪个更好:
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();
}
}
答案 0 :(得分:15)
更好的使用方法是第二个,因为如果在初始化con
或stat
时抛出异常,它们将不会被初始化,并且可能会被初始化为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
块,只是为了确保将con
和stat
对象标记为垃圾回收:
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;
}
}