Java.lang.NullPointerException

13 respostas
G

Olá,
Me pintou mais uma duvida…

gerou o erro NullPointerException … e é na minha consulta que está recebendo nulo, todos os campos… como faço pra reverter isso !!!
segue abaixo a consulta .

DAO

try {  
            session.beginTransaction();  
            String hql = "SELECT f.sigla, f.nome, f.tipo, f.n_apropriacao, f.local, f.centroCusto, f.descricaoCC, h.hora, h.dt_Dia as data, h.destino as registro ";   
                   hql += "FROM Funcionario f, Horario h ";  
                   hql += "WHERE to_date(h.dt_Dia, 'dd/MM/yyyy') BETWEEN :dataInicio AND :dataFinal ";  
                   hql += "AND to_timestamp(h.hora, 'HH24:MI') > to_timestamp('09:00', 'HH24:MI') ";  
                   hql += "AND to_timestamp(h.hora, 'HH24:MI') < to_timestamp('17:00', 'HH24:MI') ";  
                   hql += "AND flag_destino <> 'atestado'";  
  
            Query query = session.createQuery(hql);  
            query.setParameter("dataInicio", dataInicio);  
            query.setParameter("dataFinal", dataFinal);  
  
            for (Iterator it = query.iterate(); it.hasNext();) {  
                horasFunc = new HorasFuncionarioPeriodo();  
                Object[] registro = (Object[]) it.next();  
  
                horasFunc.setSigla(registro[0].toString());  
                horasFunc.setNome(registro[1].toString());  
                horasFunc.setTipo(registro[2].toString());  
                horasFunc.setN_Apropriacao(Integer.parseInt(registro[3].toString()));  
                horasFunc.setLocal(registro[4].toString());  
                horasFunc.setCentroCusto(registro[5].toString());  
                horasFunc.setDescricao(registro[6].toString());  
                horasFunc.setHora(registro[7].toString());  
                horasFunc.setData(sf.parse(registro[8].toString()));  
                horasFunc.setRegistro(registro[9].toString());  
  
                listaTotal.add(horasFunc);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            session.close();  
        }  
        return listaTotal;

e o erro.

Hibernate: /* SELECT f.sigla, f.nome, f.tipo, f.n_apropriacao, f.local, f.centroCusto, f.descricaoCC, h.hora, h.dt_Dia as data, h.destino as registro FROM Funcionario f, Horario h WHERE to_date(h.dt_Dia, 'dd/MM/yyyy') BETWEEN :dataInicio AND :dataFinal AND to_timestamp(h.hora, 'HH24:MI') > to_timestamp('09:00', 'HH24:MI') AND to_timestamp(h.hora, 'HH24:MI') < to_timestamp('17:00', 'HH24:MI') AND flag_destino <> 'atestado' */ select funcionari0_.sigla as col_0_0_, funcionari0_.nome as col_1_0_, funcionari0_.tipo as col_2_0_, funcionari0_.n_apropriacao as col_3_0_, funcionari0_.local as col_4_0_, funcionari0_.CENTRO_CUSTO as col_5_0_, funcionari0_.DESCRICAO as col_6_0_, horario1_.hora as col_7_0_, horario1_.dt_Dia as col_8_0_, horario1_.destino as col_9_0_ from funcionario funcionari0_, horario_unico horario1_ where (to_date(horario1_.dt_Dia, 'dd/MM/yyyy') between ? and ?) and to_timestamp(horario1_.hora, 'HH24:MI')>to_timestamp('09:00', 'HH24:MI') and to_timestamp(horario1_.hora, 'HH24:MI')<to_timestamp('17:00', 'HH24:MI') and flag_destino<>'atestado'
Erro ao gerar o relatorio. java.lang.NullPointerException
java.lang.NullPointerException
        acompanhamento.relatorios.RelatorioHorasFuncPeriodo.gerarRelatorio(RelatorioHorasFuncPeriodo.java:42)

nessa classe que aponta o erro…

public class RelatorioHorasFuncPeriodo {
    
    private Date dataInicio;
    private Date dataFinal;
    
    public void gerarRelatorio() {
        HashMap parametros = new HashMap();
        JRBeanCollectionDataSource beanRelatorios;
        JasperPrint impressao;
        String caminhoJasper, caminhoRelatorio;
        HorasFuncionarioPeriodoDao dao = new HorasFuncionarioPeriodoDao();
       
        try {
            caminhoJasper = "D:\\Projetos\\Acompanhamento\\web\\relatorios\\jasper\\relHorasFuncPer.jasper";
            caminhoRelatorio = "D:\\Projetos\\Acompanhamento\\web\\relatorios\\relHorasFuncPer.xls";

            parametros.put("dataInicio", dataInicio);
            parametros.put("dataFinal", dataFinal);
            
            beanRelatorios = new JRBeanCollectionDataSource(dao.gethorasFuncionarioPeriodo(dataInicio, dataFinal));
            
    (42)  impressao = JasperFillManager.fillReport(caminhoJasper, parametros, beanRelatorios);

            //Gerando Xls
            JRXlsExporter xls = new JRXlsExporter();
            xls.setParameter(JRExporterParameter.JASPER_PRINT, impressao);
            xls.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, caminhoRelatorio);
            xls.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, false);
            xls.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, true);
            xls.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, true);
            xls.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, false);
            xls.exportReport();

        } catch (Exception e) {
            System.out.println("Erro ao gerar o relatorio. " + e);
            e.printStackTrace();
        }
    }

Debugando percebi que o erro está na impressao de beanRelatorios, onde ele faz a consulta no DAO .

Alguém pode me ajudar .?!!??

tenho que terminar isso hoje =/ .

13 Respostas

Zeed01

Bom dia Galera !

Melhor você mandar o resto do código da sua classe RBeanCollectionDataSource.

Mas eu chutaria que sua consulta não esta retornando nada e sua lista “listaTotal” esta retornando nulo para o relatório…

[]s

G

Zeed01:
Bom dia Galera !

Melhor você mandar o resto do código da sua classe RBeanCollectionDataSource.

Mas eu chutaria que sua consulta não esta retornando nada e sua lista “listaTotal” esta retornando nulo para o relatório…

[]s

Eu não tenho essa classe . .JRBeanCollectionDataSource .
eu importo do JasperReport mas não tenho acesso . . =/ .

e teria como mudar isso, mesmo sem ter acesso a essa classe ?

G

Zeed01:
Bom dia Galera !

Melhor você mandar o resto do código da sua classe RBeanCollectionDataSource.

Mas eu chutaria que sua consulta não esta retornando nada e sua lista “listaTotal” esta retornando nulo para o relatório…

[]s

Eu debuguei e vi que na verdade meu erro está no meu

return listaTotal;

a minha listaTotal realmente está vindo vazia…
então o erro está nos meus set’s, que não estão salvando os valores recebidos…
ou na minha consulta no Hql !?

Zeed01

Boa tarde galera !

Mande o codigo completo do seu DAO.

[]s

G

Zeed01:
Boa tarde galera !

Mande o codigo completo do seu DAO.

[]s

Segue,

public class HorasFuncionarioPeriodoDao {

    public List horasFuncionarioPeriodo(Date dataInicio, Date dataFinal) {
        List<HorasFuncionarioPeriodo> listaTotal = new ArrayList<HorasFuncionarioPeriodo>();
        HorasFuncionarioPeriodo horasFunc;
        SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
        Session session = HibernateUtil.getSession();

        String hql = "SELECT f.sigla, f.nome, f.tipo, f.n_apropriacao, f.local, f.centroCusto, f.descricaoCC, h.hora, h.dt_Dia as data, h.destino as registro ";
        hql += "FROM Funcionario f, Horario h ";
        hql += "WHERE to_date(h.dt_Dia, 'DD/MM/YYYY') BETWEEN :dataInicio AND :dataFinal ";
        hql += "AND to_timestamp(h.hora, 'HH24:MI') > to_timestamp('09:00', 'HH24:MI') ";
        hql += "AND to_timestamp(h.hora, 'HH24:MI') < to_timestamp('17:00', 'HH24:MI') ";
        hql += "AND flag_destino <> 'atestado' ";
        hql += "ORDER BY h.dt_Dia ";

        try {
            session.beginTransaction();
            Query query = session.createQuery(hql);
            query.setDate("dataInicio", dataInicio);
            query.setDate("dataFinal", dataFinal);

            for (Iterator it = query.iterate(); it.hasNext();) {
                horasFunc = new HorasFuncionarioPeriodo();
                Object[] registro = (Object[]) it.next();
                
                horasFunc.setSigla(registro[0].toString());
                horasFunc.setNome(registro[1].toString());
                horasFunc.setTipo(registro[2].toString());
                horasFunc.setN_Apropriacao(Integer.parseInt(registro[3].toString()));
                horasFunc.setLocal(registro[4].toString());
                horasFunc.setCentroCusto(registro[5].toString());
                horasFunc.setDescricao(registro[6].toString());
                horasFunc.setHora(registro[7].toString());
                horasFunc.setData(sf.parse(registro[8].toString()));
                horasFunc.setRegistro(registro[9].toString());
               
                listaTotal.add(horasFunc);
            }
            session.beginTransaction().commit();
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.close();
        }
        return listaTotal;
    }
}

Obrigado pela ajuda!

Zeed01

Boa tarde galera !

Você testou se a sua query esta retornando algum registro ?
Veja bem… se a sua query não retornar nenhum registro não vai entrar no seu “for”, então nada sera adicionado a sua “listaTotal”, e ela estará como nulo, gerando o NullPointerException.

[]s

G

Zeed01:
Boa tarde galera !

Você testou se a sua query esta retornando algum registro ?
Veja bem… se a sua query não retornar nenhum registro não vai entrar no seu “for”, então nada sera adicionado a sua “listaTotal”, e ela estará como nulo, gerando o NullPointerException.

[]s

Mas no erro, ele exibe como fazendo a consulta da Query …e depois gera o erro …

isso não quer dizer, que a consulta estaria certa ??

Vou debugar minha query … …

Zeed01

Boa tarde Galera !

Olha, a consulta pode estar certa (sem erros), mas uma consulta certa também pode retornar nenhum registro.
Sugiro que você copie a sua string SQL e execute diretamente no banco de dados e verifique se retorna registros.
De qualquer forma você pode evitar o erro verificando se existem registros na sua lista, se não existir da uma mensagem para o usuário avisando que nao tem nada para mostrar no relatório, se existirem registros daí você chama o relatorio…

Só uma idéia, não sei se cabe ai no seu problema.

[]s

pmlm

Devolva ou não registos, a lista nunca será null. Quanto muito estará vazia e isso não provoca NullPointerException

Anime

Oi,

Acho que o problema está no caminho, tente deixa-lo menor… :wink:

G

Zeed01:
Boa tarde Galera !

Olha, a consulta pode estar certa (sem erros), mas uma consulta certa também pode retornar nenhum registro.
Sugiro que você copie a sua string SQL e execute diretamente no banco de dados e verifique se retorna registros.
De qualquer forma você pode evitar o erro verificando se existem registros na sua lista, se não existir da uma mensagem para o usuário avisando que nao tem nada para mostrar no relatório, se existirem registros daí você chama o relatorio…

Só uma idéia, não sei se cabe ai no seu problema.

[]s

Então Zeed, no banco minha consulta funciona perfeitamentee !! traz tudo que eu preciso …
tanto que a consulta do banco está igual ao netbeans, claro que com as mudanças necessárias, mas está no mesmo ritmo .
Agora não entendi a parte que você diz pra verificar a minha lista . . porque eu crio ela só pra exibir meu relatório, e quando debugo minha lista meus parametros vem, que são a data inicial e a datafinal, mas meus campos retornam null, mas eu sei que tem registros… por esse motivo penso eu que meu erro está na consulta …
mas não vejo erros a olho nu…

.
valeu

G

Anime:
Oi,

Acho que o problema está no caminho, tente deixa-lo menor… :wink:

Oi Anime,

o meu caminho é fixo pela empresa … não tenho opção de mudar de pasta e talz … infelizmenteee !!

valeu!

G

Genteee, ninguém pra me ajudaar ??? rs

meu “instrutor” falou que na verdade o erro está na minha consulta…
mas eu não consigo enxergar isso…

alguem me ajuda ??

na verdadee eu até duvidoo…
porque no banco minha consulta roda perfeitamente…
mas como sou nova em Java não questiono né…

mas alguém tem uma sugestão ???

Valeu

Criado 26 de agosto de 2011
Ultima resposta 31 de ago. de 2011
Respostas 13
Participantes 4