我仍然无法正确关闭连接,我现在遇到的错误是 Connection、Statement 和 ResultSet 变量说我必须在本地创建它们,那我该怎么办?
我的代码:
String showTableSQL = "SELECT * FROM llamadas";
try {
Connection conn = conexion.getConnection();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(showTableSQL);
while (rs.next()) {
// Obtenemos el modelo del JTable
model = (DefaultTableModel) table.getModel();
// Agregamos las filas al JTable
model.addRow(new Object[]{
Integer.toString(rs.getInt(1)),
rs.getString(2),
rs.getString(3),
rs.getString(4),
rs.getString(5),
Integer.toString(rs.getInt(6)),
Double.toString(rs.getDouble(7))
});
}
} catch (SQLException errorSQL) { errorSQL.printStackTrace(); }
finally { // Cerramos las conexiones, en orden inverso a su apertura
try { rs.close(); } catch (Exception errorRS) { errorRS.printStackTrace(); }
try { st.close(); } catch (Exception errorST) { errorST.printStackTrace(); }
try { conn.close(); } catch (Exception errorCONN) { errorCONN.printStackTrace(); }
}
错误在于
rs、st 和 conn:无法解析,创建局部变量
我希望你能帮我解决这个问题,我已经尝试了2天。我还在学习 MySQL。
任何帮助表示赞赏。
Connection
正确关闭、和Statement
的实例ResultSet
并正确处理使用典型模式可能导致的所有错误try-catch-finally
并不容易。如果你这样做了,代码就不优雅了。例如,即使您通过将变量定义移出 来解决当前的问题
try
,代码仍然至少存在一个设计缺陷。假设您以这种方式更正了代码(顺便说一下,阅读@Dev Joel 的答案下的注释,应该澄清一下,有必要将变量初始化为某个值,例如
null
. 否则,Java 编译器无法保证变量在块中使用时分配了一些值finally
,这就是它抱怨的原因。事实上,这一点与我将要演示的缺陷有关):现在想象一下这个语句中出现了一些错误:
这导致
st
并rs
留下值null
,现在,当块finally
执行时rs.close();
,st.close()
他们将抛出一个NullPointerException
本来可以避免的值。因此,处理块的正确方法是在尝试关闭变量之前
finally
检查变量是否为 a :null
更好的选择
上面简单说明了这种类型的代码由于其复杂性很容易出错。即使你做对了,复杂性也掩盖了代码的真正目的。
出于这个原因,从 Java 7 开始,有一种更好的方法来处理这种情况,使用
try-with-resources
. 使用这种技术,请注意如何简化您的代码以及它变得多么清晰:如果你阅读文档,你会看到这个简化的代码结构自动处理了以下几个方面:
.close()
这些都在块的末尾自动执行,try
并且与不同实例的打开顺序相反。.close()
,则这些异常不会覆盖主要异常(如果有)。try
还是在 中.close()
,它e.printStackTrace()
都会自动包含所有错误的信息。错误是您在第一个块中声明
rs
st
and变量,当您尝试在del中访问它们时,它们不再可访问,因为它们超出了范围。conn
try{}catch(){}
try{}catch(){}
finally
程序中三个变量的范围是第一个
try{} catch(){}
。要解决此问题,请在方法级别(之前try{}catch(){}
)声明变量一种方法是将所有内容都包含在尝试中并或多或少地像这样捕获
单例连接
例子