因此,我在执行以下流程时收到了标题中的错误,而且我真的不知道会出现什么问题。
我正在做的是尝试从数据库中创建一些数据来创建一个对象,并使用它的几个对象填充和arraylist,如果找不到则应该抛出异常
public ArrayList<Caso> buscarCasosPorJuez(String cedula) throws java.sql.SQLException,Exception{
java.sql.ResultSet rs;
String sql;
Caso caso;
ArrayList<Caso> casos = new ArrayList();
sql="SELECT * "+
"FROM tcaso "+
"WHERE CedulaJ='"+cedula+"';";
Conector.getConector().ejecutarSQL(sql);
rs = Conector.getConector().ejecutarSQL(sql,true);
while (rs.next()){
caso = new Caso(
rs.getInt("NumCaso"),
rs.getString("DescripcionCaso"),
rs.getString("EstadoCaso"),
rs.getDate("FechaCreacion").toLocalDate(),
persona.buscarJuezPorCedula(rs.getString("CedulaJ")),
persona.buscarQuerellante(rs.getString("CedulaQ"))
);
casos.add(caso);
}
rs.close();
return casos;
}
以下两种方法&#34; New Caso&#34;正在呼吁最后两行。
public Juez buscarJuezPorCedula(String cedula) throws java.sql.SQLException,Exception{
Juez juez = null;
java.sql.ResultSet rs;
String sql;
sql = "SELECT Sala,Usuario,Clave,NombreJ,ApellidosJ,TelefonoJ,CedulaJ "+
"FROM tjuez "+
"WHERE CedulaJ='"+cedula+"';";
rs = Conector.getConector().ejecutarSQL(sql,false);
if (rs.next()){
juez = new Juez(
rs.getInt("Sala"),
rs.getString("Usuario"),
rs.getString("Clave"),
rs.getString("NombreJ"),
rs.getString("ApellidosJ"),
rs.getString("TelefonoJ"),
rs.getString("CedulaJ"));
} else {
throw new Exception ("Persona no encontrada intentelo de nuevo.");
}
rs.close();
return juez;
}
public Querellante buscarQuerellante(String cedula) throws java.sql.SQLException,Exception{
Querellante querellante = null;
java.sql.ResultSet rs;
String sql;
sql = "SELECT DireccionQ,NombreQ,ApellidosQ,TelefonoQ,CedulaQ "+
"FROM tquerellante "+
"WHERE CedulaQ='"+cedula+"';";
rs = Conector.getConector().ejecutarSQL(sql,true);
if (rs.next()){
querellante = new Querellante(
rs.getString("DireccionQ"),
rs.getString("NombreQ"),
rs.getString("ApellidosQ"),
rs.getString("TelefonoQ"),
rs.getString("CedulaQ"));
} else {
throw new Exception ("Persona no encontrada intentelo de nuevo.");
}
rs.close();
return querellante;
}
感谢您提供的所有帮助。
答案 0 :(得分:1)
我怀疑您正在关闭Statement
中的ejucutarSQL()
对象,该对象会关闭从中派生的所有ResultSets
。
你实际上不能编写这样的通用SQL执行方法,至少在没有使用CachedRowSet
的情况下,这会占用内存。
您需要沿着更传统的行重构此代码,并将显式Connector
和Statement
个对象作为局部变量,以便您可以按获取的相反顺序关闭它们。
您应该使用PreparedStatements
而不是在SQL字符串中构建参数。如果抛出异常,也会泄漏结果集。
例如:
public Querellante buscarQuerellante(String cedula) throws java.sql.SQLException,Exception{
String sql = "SELECT DireccionQ,NombreQ,ApellidosQ,TelefonoQ,CedulaQ "+
"FROM tquerellante "+
"WHERE CedulaQ=?";
try (Connnector conn = ...; // TODO
PreparedStatement ps = conn.prepareStatement(sql);
)
{
ps.setObject(1, cedula);
try (ResultSet rs = ps.execute())
{
if (rs.next()){
return new Querellante(
rs.getString("DireccionQ"),
rs.getString("NombreQ"),
rs.getString("ApellidosQ"),
rs.getString("TelefonoQ"),
rs.getString("CedulaQ"));
} else {
throw new Exception ("Persona no encontrada intentelo de nuevo.");
}
}
}
}
请注意,try-with-resources始终会关闭所有已分配的内容,并按照与获取相反的顺序关闭。