ERRO: java.sql.SQLException: Operation not allowed after ResultSet closed

Boa noite, amigos
Tudo bem?

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


package UsuarioGRUD;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import BancoDados.Conexao;

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();
		}
	}

}

estatus.close();

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.

1 curtida

Amigo, obrigado mesmo. Vou tentar fazer aqui

Primeiramente, obrigado pela atenção e ajuda ao novos iniciantes
Fiz isso mas o erro ainda continua, será que tem outro jeito???

package UsuarioGRUD;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import BancoDados.Conexao;

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).

1 curtida

Muito obrigado
Deu certo graça a sua ajuda, com certeza essa dúvida vai ajudar outras pessoas.
Obrigado mesmo!!!

dados = estatus.executeQuery();
estatus.execute();  <-- apaga essa linha aqui, você já executou o statement na linha anterior
if (dados.next()) {
1 curtida