追踪NullPointerException

时间:2010-12-19 22:15:06

标签: java

我需要将数据保存到MySQL数据库。问题是我每秒都有很多新数据需要过滤它,所以我只保存必要的数据。因此,当我获得新数据时,我创建了一个对象并调用方法processData。出于某种原因,这是行不通的。这是我的方法:

import java.util.Date;
import org.llrp.ltk.types.UnsignedShort;
import hr.fer.rfid.MySQLAccess;
public class Brain {
    Data[] datas = new Data[]();
    Data[] temps = new Data[]();
    public void processValues(Data dat){

       if(temps==null){
           datas[0]=dat;
           temps[0]=dat;
       }
       for (i=0;i<(temps.length+1);i++){
          System.out.println("Process value: "+i);
          if(i==(temps.length+1)){
             temps[i]=dat;
             datas[datas.length+1]=dat;
          }
          if(i<=temps.length) {
           if(dat.epc==temps[i].epc)
              if((dat.antenna!=temps[i].antenna)
                ||((dat.date.getTime()-temps[i].date.getTime()>=5000)
                  &&(dat.date.getTime()-temps[i].date.getTime()<=20000))) {
                  temps[i]=dat;
                  try {

                   dao.writeToDatabase(dat);
                  } catch (Exception e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
                  }
              }
          }
       }
    }
 }

我得到NullPointerException

2 个答案:

答案 0 :(得分:2)

至少现在编译。请注意数据数组声明的更改。如果阵列不够动态,我建议改为使用List<Data>

import java.util.Date;
public class Brain {

    private static final int DEFAULT_SIZE = 10;
    Data[] datas = new Data[DEFAULT_SIZE];
    Data[] temps = new Data[DEFAULT_SIZE];
    Dao dao = new Dao();

    public void processValues(Data dat){

       if(temps==null){
           datas[0]=dat;
           temps[0]=dat;
       }
       for (int i=0;i<(temps.length+1);i++){
          System.out.println("Process value: "+i);
          if(i==(temps.length+1)){
             temps[i]=dat;
             datas[datas.length+1]=dat;
          }
          if(i<=temps.length) {
           if(dat.epc==temps[i].epc)
              if((dat.antenna!=temps[i].antenna)
                ||((dat.date.getTime()-temps[i].date.getTime()>=5000)
                  &&(dat.date.getTime()-temps[i].date.getTime()<=20000))) {
                  temps[i]=dat;
                  try {

                   dao.writeToDatabase(dat);
                  } catch (Exception e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
                  }
              }
          }
       }
    }
 }

class Data
{
    public String epc;
    public Date date;
    public String antenna;
}

class Dao
{
    public void writeToDatabase(Data data)  {}
}

答案 1 :(得分:1)

您的代码中存在许多问题,因此这是第一个问题:

if(temps==null){
    datas[0]=dat;
    temps[0]=dat;
}

如果temps为空,则保证NullPointerException。

您也没有检查dat是否为空,您的代码也没有显示您已初始化dao

与NPE无关,但这是一个逻辑错误:

for (i=0;i<(temps.length+1);i++){
    System.out.println("Process value: "+i);
    if(i==(temps.length+1)) {
        ...
    }

i永远不会是temps.length + 1,因为循环条件是i < temps.length + 1

这里还有其他问题,无法提及。我强烈建议您使用一些静态分析工具(例如CheckstyleFindBugs)来帮助提高代码质量。这些都是很好的开源工具,可以在它们变成bug之前发现常见错误。我一直使用它们,它们极大地提高了我的编码标准。