ArrayList相关的调试问题

时间:2011-01-31 00:51:33

标签: java

请帮我解释一下。我似乎无法弄清楚为什么会产生空指针异常

/* Try to find customer in customer list, if not in list add to list with a 
new plan; otherwise add additional plan to customer*/


for(int a = 0; a < dataset.length; a++){

       if(customer_name_list.contains(dataset[a][CLIENT_NAME])){
            int temp_index = 0;

//NULLPOINTEREXCEPTION OCCURRED ON THE FOLLOWING LINE 
            while(!customer.get(temp_index).name.equals(dataset[a][CLIENT_NAME])){
                temp_index++;
            }
            customer.get(temp_index).add_plan(dataset[a][PLAN], dataset[a][DETAIL]);
       }

       else{
                Customer temp_customer = new Customer(dataset[a][CLIENT_NAME], dataset[a][PLAN], dataset[a][DETAIL]);

       customer.add(temp_customer);
       customer_name_list.add(dataset[a][CLIENT_NAME]);
       }
   }

感谢您的帮助

4 个答案:

答案 0 :(得分:2)

将此作为行,异常发生在:

while(!customer.get(temp_index).name.equals(dataset[a][CLIENT_NAME])){

有很多事情可以解决这个问题。首先,customer可以为空。其次,customer.get(temp_index)的结果可能为空。最后,customer.get(temp_index).name也可以为空。

由于我们没有使用此处设置的完整代码,因此我建议您单步执行并打印出上述每个内容的值,以确定哪些是null(或使用调试器)。这样你就可以了能够确切地看到导致异常的原因。我的猜测是客户的名字可能会设置为null,这会导致问题,但它可能很容易就是我提到的任何其他事情。

答案 1 :(得分:1)

如果没有找到你就不退出循环,而是继续前进。尝试添加一个计数器或子句,这样你就不用了。

答案 2 :(得分:1)

您的customer集合或其中一个元素或其中一个元素的name字段为空。如果不了解customer集合中的内容,我就无法再说些什么。

但是一个好主意是在某种日志文件的循环中打印出temp_index,这样你就可以看到它在完成之前完成了多少次迭代。

您可能会觉得有用的另一件事是尝试避免在同一行上多个解除引用运算符(.),尤其是如果您对所访问的数据知之甚少。

您可以创建一个辅助方法,例如:

 private String getCustomerName( int index ) {
   Customer c = customer.get( index );
   return c.name;
 }

并在你的while循环中使用它。

虽然不相关,但正如其他人所指出的那样,如果找不到匹配的元素,你的循环将以IndexOutOfBoundsException结尾,所以你也必须修复它。

答案 3 :(得分:1)

for (dataA : dataset) {
 if (customer_name_list.contains(dataA[CLIENT_NAME])) {
  for (c : customer) if (dataA[CLIENT_NAME].equals(c.name)) {
   c.add_plan(dataA[PLAN], dataA[DETAIL]);
   break;
  }
 } else {
  customer.add(new Customer(dataA[CLIENT_NAME], dataA[PLAN], dataA[DETAIL]));
  customer_name_list.add(dataA[CLIENT_NAME]);
 }
}

这就是你在做什么,只是更干净。我建议您可能希望切换到散列数据结构(例如,HashMap)或排序数据结构,以改善查找和搜索调用。然后上面看起来像

for (data : dataset) {
 if ((Customer c = customer_map.get(data[CLIENT_NAME]))!=null) {
  c.add_plan(data[PLAN], data[DETAIL]);
 } else {
  customer_map.put(data[CLIENT_NAME], new Customer(data[CLIENT_NAME], data[PLAN], data[DETAIL]));
 }
}

除了在大脑上更容易之外,还有更好的性能。如果您需要其他内容,例如基于插入顺序的迭代,则可以使用适当的地图风格。

对于NPE,这意味着您获取的项目未正确初始化 - temp_index中的项目为null(并且获取name会抛出NPE)或{{1是} name并尝试在其上调用null会抛出NPE。如果索引不存在,那么你将获得越界样式异常。