Sou iniciante no mundo da programação, através de tutorias estou tentando aprender e desenvolver, porém infelizmente não estou conseguindo entender o erro abaixo do meu código. Por gentileza, poderia me ajudar?
java.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
at com.mysql.cj.jdbc.result.ResultSetImpl.checkClosed(ResultSetImpl.java:437)
at com.mysql.cj.jdbc.result.ResultSetImpl.next(ResultSetImpl.java:1712)
at UsuarioGRUD.Acesso.loginInstrutor(Acesso.java:24)
at UsuarioGRUD.Acesso.main(Acesso.java:40)
Esse é o erro
Essa linha fecha o PreparedStatement, que por consequência fecha o ResultSet associado. Em seguida você tenta acessar o ResultSet fechado (dados.next()), o que causa a exceção que você está vendo.
Uma sugestão é declarar o PreparedStatement fora do try/catch e colocar essa linha dentro de um finally. Outra alternativa é usar um try with resources.
public class Acesso {
Conexao conex = new Conexao();
public boolean loginInstrutor(String nomeInstrutor, String senha) throws SQLException {
boolean resposta = false;
ResultSet dados = null;
String sql = "SELECT nomeInstrutor, senhaInstrutor FROM tbl_instrutor WHERE nomeInstrutor=? AND senhaInstrutor=?";
PreparedStatement estatus = null;
try {
estatus = conex.getConexao().prepareStatement(sql);
estatus.setString(1, nomeInstrutor);
estatus.setString(2, senha);
dados = estatus.executeQuery();
estatus.execute();
if(dados.next()) {
return resposta = true;
}else {
return resposta = false;
}
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally {
try{
estatus.close();
}catch(SQLException onConClose){
return resposta;
}}
return resposta;}
public static void main(String[]args){
Acesso teste = new Acesso();
try {
if(teste.loginInstrutor("teste","teste")) {
System.out.print("Seja Bem-vindos");
}else {
System.out.print("Erro ao logar");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}______________________________________
Erro ao logarjava.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
at com.mysql.cj.jdbc.result.ResultSetImpl.checkClosed(ResultSetImpl.java:437)
at com.mysql.cj.jdbc.result.ResultSetImpl.next(ResultSetImpl.java:1712)
at UsuarioGRUD.Acesso.loginInstrutor(Acesso.java:26)
at UsuarioGRUD.Acesso.main(Acesso.java:47)
estatus.execute(); remova essa linha. Você está fazendo a query duas vezes, nessa linha e na de cima. Na segunda, está jogando o resultado da primeira fora (fechando o ResultSet).