0

我创建了一个使用迭代器的方法,该迭代器遍历一个映射,并为每一对评估一个具有许多 OR 条件的语句。如果条件为真,它将对的对象(通知对象)添加到列表(异常)中。但是,在编译时,编译器会在此方法处给出 NullPointerException 异常。根据我的调查,if 语句似乎有问题,但我不明白为什么。任何人都可以在这方面给我帮助吗?谢谢!

public List<Notification> getAnomalies(NotificationSearchCriteria notificationSearchCriteria) {

 Map<String,Notification> messageList = new HashMap<String,Notification>();
List<Notification> anomalies = new ArrayList<Notification>();

Iterator iterator = messageList.entrySet().iterator();
while (iterator.hasNext()) {

    Map.Entry pairs = (Map.Entry)iterator.next();
    Notification message = (Notification) pairs.getValue();

           if(message.getDescription().equals(notificationSearchCriteria.getDescription())||message.getSubjectName().equals(notificationSearchCriteria.getSubjectName())||message.getNotificationSubject().toString().equals(notificationSearchCriteria.getNotificationSubject().toString())||message.getNotificationType().toString().equals(notificationSearchCriteria.getNotificationType().toString())){

               anomalies.add(message);

             }
        }

    }
    return anomalies;
}
4

3 回答 3

1

这很可能是由message返回 null 的方法之一引起的。例如,如果message.getDescription()返回 null,那么message.getDescription().equals(<something>)将抛出一个NullPointerException,因为您不能在 null 对象上调用其他方法。

有几种方法可以解决这个问题。首先,我建议检查您的对象以查看哪些可以返回空值并添加适当的处理代码。

更一般地说,我总是建议对你知道不为空的变量调用 equals 以避免这些问题。例如

if ("accept".equals(command)) {
  // do something
}  

一般优于

if (command.equals("accept")) {
 // do something
}

因为第二个可能通过 NPE,而第一个永远不会。

于 2013-02-08T15:18:29.893 回答
0

我会将消息匹配代码重构到NotificationSearchCriteria类中。最终if将是“if (notificationSearchCriteria.matches(message))”。从名称来看,我猜这是NotificationSearchCriteria唯一的用法;从这个意义上说,它不会增加耦合。

NotificationSearchCriteria在构造过程中将执行空值检查;这将确保所有字段都不为空。在匹配的代码中,在该类中,情况如下所示:

boolean matches(Notification message) {
   if (description.equals(message.getDescription()) ||  // LHS guaranteed non-null
      foo.equals(message.getFoo()) ||
      bar.equals(message.getBar()) || // ...
   ) { return true; }
}
于 2013-02-08T15:41:42.173 回答
0

最好的编码方式是进行空值检查。

理想情况下,我会有这样的代码:

 while (iterator.hasNext()) {

    Map.Entry pairs = (Map.Entry)iterator.next();
    Notification message = (Notification) pairs.getValue();
          if(null!=message && null!=message.getDescription() &&        
               null!=notificationSearchCriteria.getDescription() )
          {
             //Do your comparioson
          }else{
           //Handle the NullPointerException error the way you want
          }
  }
于 2013-02-08T15:54:22.977 回答