Null pointer exception em Result Set

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

Segue meu metodo:

[code] 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");
            }
        }
    }
}[/code]

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

[code]

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

}[/code]

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.

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.

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

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.