if语句中的多个OR条件

时间:2013-02-08 15:07:37

标签: java

我创建了一个方法,该方法使用迭代遍历映射的迭代器,并且对于每个对,它评估具有许多OR条件的语句。如果条件为真,则在列表中添加对的对象(Notification对象)(异常)。但是,在编译时,编译器会在此方法中给出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;
}

3 个答案:

答案 0 :(得分:1)

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

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

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

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

通常优于

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

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

答案 1 :(得分:0)

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

NotificationSearchCriteria构建期间将执行check-for-null;这将确保所有字段都为非null。在匹配的代码中,在该类中,事情看起来像:

boolean matches(Notification message) {
   if (description.equals(message.getDescription()) ||  // LHS guaranteed non-null
      foo.equals(message.getFoo()) ||
      bar.equals(message.getBar()) || // ...
   ) { return true; }
}

答案 2 :(得分: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
          }
  }