NullPointerException

Fala pessoal! Estou intrigado aqui com esse NullPointerException que está sendo lançado na minha aplicação!

O lance é o seguinte… a minha aplicação acessa uma base de dados que contém dados de chuva. A tabela que ela consulta têm uma chave primária dupla (data da medição, id da estação). Na minha aplicação eu tenho uma classe que representa essa chave primária (TimeSerieDataPK) e a classe que representa minha serie de dados temporais (TimeSerieData). TimeSerieData contém um TreeMap<TimeSerieDataPK, Double> onde armazena a chave primária e o valor da chuva naquele instante para uma estação específica.

O problema se dá quando o usuário deseja exportar os dados da base de dados. A aplicação simplesmente consulta o banco e coloca cada conteudo da tabela consultada como sendo um elemento do TimeSerieData, utilizando o método put(key,value).

Neste método put, é lançada uma NullPointerException. No seguinte método:

    public double put(Date date, String gaugeCode, double value){
        //DEBUG
        System.out.println("date = "+date);
        System.out.println("gaugeCode = "+gaugeCode);
        System.out.println("value = "+value);
        TimeSerieDataPK key = new TimeSerieDataPK(date,gaugeCode);
        System.out.println("key = "+key);
        System.out.println("this.datas = "+this.datas);

        return this.datas.put(key, value); //Aqui é lançada a exceção
    }

Já verifiquei se existe algum objeto que seja null mas não. O objeto date chega com um valor correto, assim como gaugeCode e value. O objeto key é criado também, porém na linha this.datas.put(key, value) é lançada a referida exceção.

Segue as classes…

[code]
public class TimeSerieDataPK {
private Date date;
private String gaugeCode;

public TimeSerieDataPK(Date date, String gaugeCode) {
    this.date = date;
    this.gaugeCode = gaugeCode;
}

(…)

@Override
public boolean equals(Object obj) {
    if(obj instanceof TimeSerieDataPK)
            if(((TimeSerieDataPK)obj).getDate().compareTo(this.getDate())==0)
                if(((TimeSerieDataPK)obj).getGaugeCode().compareTo(this.getGaugeCode())==0)
                    return true;
    return false;
}

@Override
public int hashCode() {
    return Integer.parseInt(this.getGaugeCode())*2/3;
}

}[/code]

A classe que representa a minha série de dados temporal é a seguinte:

[code]
public class TimeSerieData {

public static final int TIMESERIE_INSTANTANEOUS = 0;
public static final int TIMESERIE_10_IN_10_MINUTES = 1;
public static final int TIMESERIE_15_IN_15_MINUTES = 2;
public static final int TIMESERIE_6_IN_6_HOURS = 3;
public static final int TIMESERIE_HOURLY = 4;
public static final int TIMESERIE_DAYLY = 5;
public static final int TIMESERIE_MONTHLY = 6;
public static final int TIMESERIE_YEARLY = 7;

private TreeMap<TimeSerieDataPK, Double> datas;
private int typeOfTimeSerieData;

public TimeSerieData(int typeOfTimeSerieData) {
    this.datas = new TreeMap<TimeSerieDataPK, Double>();
    this.typeOfTimeSerieData = typeOfTimeSerieData;        
}

public void put(TimeSerieDataPK key, double sum) {
    this.datas.put(key, sum);
}

public double put(Date date, String gaugeCode, double value){
    //DEBUG
    System.out.println("date = "+date);
    System.out.println("gaugeCode = "+gaugeCode);
    System.out.println("value = "+value);
    TimeSerieDataPK key = new TimeSerieDataPK(date,gaugeCode);
    System.out.println("key = "+key);
    System.out.println("this.datas = "+this.datas);

    return this.datas.put(key, value);
}

(…)
}[/code]

Console:

[LOG] - [beer.gui.GUI_PanelExportDischarge] Todos os componentes de interface gráfica foram inicializados date = Thu Nov 30 14:40:00 BRST 2006 gaugeCode = 8 value = 0.1 key = beer.beans.TimeSerieDataPK@5 this.datas = {} Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at beer.beans.TimeSerieData.put(TimeSerieData.java:58) at beer.io.dao.GenericMethodsBDDAO.getMinuteData(GenericMethodsBDDAO.java:242) at beer.io.dao.DischargeGaugeBDDAO.getMinuteData(DischargeGaugeBDDAO.java:181) at beer.manipulators.DischargeManipulator.getHourlyData(DischargeManipulator.java:101) at beer.BEERFacade.getHourlyPrecOfDischargeTable(BEERFacade.java:815) at beer.gui.GUI_PanelExportDischarge.btnVisualizeActionPerformed(GUI_PanelExportDischarge.java:513) at beer.gui.GUI_PanelExportDischarge.access$300(GUI_PanelExportDischarge.java:28) at beer.gui.GUI_PanelExportDischarge$5.actionPerformed(GUI_PanelExportDischarge.java:166) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:5517) at javax.swing.JComponent.processMouseEvent(JComponent.java:3135) at java.awt.Component.processEvent(Component.java:5282) at java.awt.Container.processEvent(Container.java:1966) at java.awt.Component.dispatchEventImpl(Component.java:3984) at java.awt.Container.dispatchEventImpl(Container.java:2024) at java.awt.Component.dispatchEvent(Component.java:3819) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822) at java.awt.Container.dispatchEventImpl(Container.java:2010) at java.awt.Window.dispatchEventImpl(Window.java:1791) at java.awt.Component.dispatchEvent(Component.java:3819) at java.awt.EventQueue.dispatchEvent(EventQueue.java:463) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149) at java.awt.EventDispatchThread.r
Aguardo =D

Tem certeza que datas foi inicializado, que não está nulo? Se foi naquela linha, pra mim só pode ser isso.

Não, não… dá uma sacada no console! Tá imprimindo a data =D

Ok, mas já rodou em debug?

Já sim! E tá tudo beleza! O que vou fazer agora é testar a classe, usando JUnit… vou aprender agora =D

Sugeres alguma coisa?

Abraços!

Cara, o que tem na linha 58 da classe TimeSerieData.java?

Em outra lista de discussão, um colega escreveu isto:

Pois bem, não entendi como resolver…

De qualquer forma, fiz isso:

TimeSerieDataPK key = new TimeSerieDataPK(date,gaugeCode); this.datas.put(key, value); return this.datas.get(key);

Quando fiz isso deu uma ClassCastException…

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: beer.beans.TimeSerieDataPK at java.util.TreeMap.compare(TreeMap.java:1093) at java.util.TreeMap.getEntry(TreeMap.java:347) at java.util.TreeMap.get(TreeMap.java:265) at beer.beans.TimeSerieData.put(TimeSerieData.java:54) at beer.io.dao.GenericMethodsBDDAO.getMinuteData(GenericMethodsBDDAO.java:242) at beer.io.dao.DischargeGaugeBDDAO.getMinuteData(DischargeGaugeBDDAO.java:181) at beer.manipulators.DischargeManipulator.getHourlyData(DischargeManipulator.java:101) at beer.BEERFacade.getHourlyPrecOfDischargeTable(BEERFacade.java:815) at beer.gui.GUI_PanelExportDischarge.btnVisualizeActionPerformed(GUI_PanelExportDischarge.java:513) at beer.gui.GUI_PanelExportDischarge.access$300(GUI_PanelExportDischarge.java:28) at beer.gui.GUI_PanelExportDischarge$5.actionPerformed(GUI_PanelExportDischarge.java:166) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:5517) at javax.swing.JComponent.processMouseEvent(JComponent.java:3135) at java.awt.Component.processEvent(Component.java:5282) at java.awt.Container.processEvent(Container.java:1966) at java.awt.Component.dispatchEventImpl(Component.java:3984) at java.awt.Container.dispatchEventImpl(Container.java:2024) at java.awt.Component.dispatchEvent(Component.java:3819) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822) at java.awt.Container.dispatchEventImpl(Container.java:2010) at java.awt.Window.dispatchEventImpl(Window.java:1791) at java.awt.Component.dispatchEvent(Component.java:3819) at java.awt.EventQueue.dispatchEvent(EventQueue.java:463) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149) at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

Cara, tenta observar se a chave (key) que vc está colocando não está nula, pelo debug.

Ja me liguei o que é…

minha key não tá implementando Comparable… de acordo com o JavaDOC em TreeMap as key’s tem que implementar Comparable… =D
Eu não sabia =P

Resolvido :smiley: