Null pointer exception em Result Set

3 respostas
Tektron

Boa tarde, estou precisando carregar um Result Set para assim manipular os dados e gravar em uma nova tabela.

Segue meu metodo:

static public void gradeHorario(int ano) throws SQLException, Exception {
        String sql, auxSql;        
        int periodo, auxPeriodo;
       // DBConexao db = new DBConexao();
        conexaoBD cDB = new conexaoBD();

        removerGradeHorario(ano);

        //variavel "i" controla o dia da semana
        for (int i = 1; i < 6; i++) {

            auxSql = "";

            if (i == 1) {
                auxSql = " and F.segunda=true";
            } else {
                if (i == 2) {
                    auxSql = " and F.terca=true";
                } else {
                    if (i == 3) {
                        auxSql = " and F.quarta=true";
                    } else {
                        if (i == 4) {
                            auxSql = " and F.quinta=true";
                        } else {
                            if (i == 5) {
                                auxSql = " and F.sextra=true";
                            }
                        }
                    }
                }
            }


            sql = " select DTP.disciplina, D.periodo, DTP.turma, DTP.professor "
                    + " from discturmaprof  DTP, disciplina D, frequencia F, professor P "
                    + " where DTP.disciplina=D.codigo and DTP.professor=P.codigo and P.frequencia=F.codigo " + auxSql;
            
            ResultSet dados = abreConexoes.stmt.executeQuery(sql);
            
            periodo = 0;
            auxPeriodo = 0;
            if (dados.first()) {
                while (dados.next()) {
                    while (periodo < (dados.getInt("periodo") + auxPeriodo)) {

                        Gradehorario gradeHorario = new Gradehorario();
                        gradeHorario.setDia(i);
                        gradeHorario.setDisciplina(dados.getInt("disciplina"));
                        gradeHorario.setPeriodo(periodo + 1);
                        gradeHorario.setProfessor(dados.getInt("professor"));
                        gradeHorario.setTurma(dados.getInt("turma"));
                        inserir(gradeHorario);
                        
                        periodo++;
                    }
                    auxPeriodo = dados.getInt("periodo");
                }
            }
        }
    }

Abaixo segue a classe abre conexão:

public class abreConexoes {
 
    public static Connection con;
    public static Statement stmt;

    public static void abreConexoes() throws Exception {
        con = conexaoBD.getInstance().getConnection();
        stmt = con.createStatement();
    }
}

ConexaoBD

public class conexaoBD {

    private static conexaoBD instancia = null;
    private Connection conexao = null;

    public conexaoBD() throws Exception {

        // Carrega informaç?es do arquivo de propriedades
        Properties prop = new Properties();
        prop.load(new FileInputStream("DB.properties"));
        String dbdriver = prop.getProperty("db.driver");
        String dburl = prop.getProperty("db.url");
        String dbuser = prop.getProperty("db.user");
        String dbsenha = prop.getProperty("db.senha");

        // Carrega Driver PostgreSQL
        Class.forName(dbdriver);

        if (dbuser.length() != 0) // conex?o COM usuário e senha
        {
            conexao = DriverManager.getConnection(dburl, dbuser, dbsenha);
        } else // conex?o SEM usuário e senha
        {
            conexao = DriverManager.getConnection(dburl);
        }
    }

// Retorna instância
    public static conexaoBD getInstance() throws Exception {
        if (instancia == null) {
            instancia = new conexaoBD();
        }
        return instancia;
    }

    // Retorna conex?o
    public Connection getConnection() {
        if (conexao == null) {
            throw new RuntimeException("conexao==null");
        }
        return conexao;
    }

    // Efetua fechamento da conex?o
    public void shutDown() {
        try {
            conexao.close();
            instancia = null;
            conexao = null;
        } catch (Exception e) {
            System.err.println(e);
        }
    }
}
O erro acontece quando chega na linha
ResultSet dados = abreConexoes.stmt.executeQuery(sql);
do primeiro método.

Testei o sql diretamente no banco e esta funcionando.

Não sei se deu para entender, duvidas estou a disposição.

Desde já agradeço.

3 Respostas

rafadelnero

Olá Tektron, provavelmente sua variável abreConexoes.stmt não foi instanciada, instancie e veja se o problema é resolvido, só uma dica, tente separar seu código por responsabilidades.

Mostre como você está instanciando a classe abreConexoes.

Polverini

ao invés de usar

public static void abreConexoes() throws Exception {  
        con = conexaoBD.getInstance().getConnection();  
        stmt = con.createStatement();  
    }

use

static{
try{
  con = conexaoBD.getInstance().getConnection();  
        stmt = con.createStatement(); 
}catch(Exception e){
e.printStackTrace();

}

ou chame a ação para instanciar o stmt

S

Ola Tektron, tudo bem??

Pelo que percebi, você criou algumas classes para efetuar a conexão com o BD, certo? Porque você não cria uma única classe genérica e depois faz as classes que necessitam fazer consultas ao BD entenderem a classe genérica? Segue um exemplo que fiz que acredito ficar mais fácil e talvez resolver seu problema.

// Classe genérica com funções de conexão ao BD...

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public abstract class DAOGenerica {

    public Connection getConnection() {
        try {
        	// STEP 1: Register JDBC
            Class.forName(DRIVER);
            
            // PASSO 2: Abrir conexao
            System.out.print("Conectando ao BD... ");
            Connection cx = DriverManager.getConnection(URL,USER,PASS);
            System.out.print("CONECTADO!!!\n");
            return cx;
        } catch (Exception ex) {
            e.printStackTrace();
            System.exit(0);
        }
    }

    public Statement getStatement() throws SQLException {
        return getConnection().createStatement();
    }

    public PreparedStatement getStatement(String st) throws SQLException {
        return getConnection().prepareStatement(st);
    }

    public ResultSet executeQuery(String query,Object... params) throws SQLException {
        PreparedStatement ps = getStatement(query);
        for (int i = 0; i < params.length; i++) {
            ps.setObject(i+1, params[i]);
        }
        return ps.executeQuery();
    }
}

Agora você pega sua classe e extende desta genérica, tipo assim:

// Dei o nome da classe como DAOHorario, se quiser utilize qualquer outro...
import java.sql.ResultSet;
import java.util.List;
import java.util.LinkedList;

public class DAOHorario extends DAOGenerica {

	public void gradeHorario(int ano) throws SQLException, Exception {
        String sql, auxSql;        
        int periodo, auxPeriodo;

        removerGradeHorario(ano);

        //variavel "i" controla o dia da semana
        for (int i = 1; i < 6; i++) {

            auxSql = "";

            // Função switch para controlar o dia da semana...
            switch (i) {
	            case 1:
	            	auxSql = " and F.segunda=true";
	            	break;
	            case 2:
	            	auxSql = " and F.terca=true";
	            	break;
	            case 3:
	            	auxSql = " and F.quarta=true";
	            	break;
	            case 4:
	            	auxSql = " and F.quinta=true";
	            	break;
	            case 5:
	            	auxSql = " and F.sexta=true";
	            	break;
	            default:
	            	break;
            }

            sql = " select DTP.disciplina as disciplina, D.periodo as periodo, DTP.turma as turma, DTP.professor as professor "
                    + " from discturmaprof  DTP, disciplina D, frequencia F, professor P "
                    + " where DTP.disciplina=D.codigo and DTP.professor=P.codigo and P.frequencia=F.codigo " + auxSql;
            
            // a funçao executeQuery, irá chamar a função executeQuery da classe genérica, fazendo todas as conexoes com DB
            ResultSet dados = executeQuery(sql);
            
            periodo = 0;
            auxPeriodo = 0;
            if (dados.first()) {
                while (dados.next()) {
                    while (periodo < (dados.getInt("periodo") + auxPeriodo)) {

                        Gradehorario gradeHorario = new Gradehorario();
                        gradeHorario.setDia(i);
                        gradeHorario.setDisciplina(dados.getInt("disciplina"));
                        gradeHorario.setPeriodo(periodo + 1);
                        gradeHorario.setProfessor(dados.getInt("professor"));
                        gradeHorario.setTurma(dados.getInt("turma"));
                        inserir(gradeHorario);
                        
                        periodo++;
                    }
                    auxPeriodo = dados.getInt("periodo");
                }
            }
        }
    }
}

Modifiquei algumas coisas em seu código:

  1. Coloquei um switch-case para controlar o dia da semana, fica mais legível que um monte de if-else
  2. Sua consulta SQL busca dados de diversas tabelas, certo, sendo assim, na minha opinião, para evitar conflitos com o nome da coluna na tabela, é interessante colocar um alias para cada coluna com a finalidade de facilitar a busca na utilização dos dados do ResultSet.
    Fica ai a dica.

Espero que esse código tenha lhe ajudado.

Criado 3 de agosto de 2014
Ultima resposta 10 de ago. de 2014
Respostas 3
Participantes 4