2013-02-08 5 views
0

Я создал метод, который использует итератор, который выполняет итерацию через карту, и для каждой пары он вычисляет оператор со многими условиями ИЛИ. Если условие истинно, оно добавляет объект пары (объект уведомления) в список (аномалии). Однако во время компиляции компилятор предоставляет исключение NullPointerException в этом методе. Основываясь на моем исследовании, кажется, что в заявлении if есть проблема, но я не понимаю, почему. Может ли кто-нибудь помочь мне в этом? Благодаря!Множественные условия OR в операторах 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; 
} 
+0

Перед 'if' заявления, распечатать каждый из объектов вы изучения (' message.getDescription() ',' notificationSearchCriteria.getDescription() 'и т. д.), чтобы убедиться, что ни один из них не является« нулевым ». Я предполагаю, что один из них нигде не назначается. – iamnotmaynard

+3

'NullPointerException' происходит во время выполнения, ** никогда ** во время компиляции. – jlordo

+0

Ваш оператор if выглядит неправильно, но исключение NullPointerException для меня звучит как один из объектов в инструкции if, действительно, является нулевым. Я бы удостоверился, что notificationSearchCriteria не является нулевым, когда он передается в функцию и видит, помогает ли это. –

ответ

1

Это, скорее всего, вызвано одним из методов на message возвращении нуля. Например, если message.getDescription() возвращает null, то message.getDescription().equals(<something>) будет вызывать NullPointerException, так как вы не можете вызывать дополнительные методы для нулевого объекта.

Существует несколько способов исправить это. Прежде всего, я рекомендую проверить ваши объекты, чтобы увидеть, что может вернуть нулевое значение и добавить соответствующий код обработки.

В целом, я всегда рекомендую называть равным по переменной, которую вы знаете, не равны нулю, чтобы избежать этих проблем. Например

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

, как правило, лучше, чем

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

, потому что вторая мощь через NPE, в то время как первый никогда не будет.

+0

Вы правы, используя строковый литерал и вызывающий 'equals()', это более безопасный способ сделать это, но в этом случае это неприменимо, поскольку OP не знает 'a' или' b' в своем ' a.equals (б) '. – jlordo

+0

Он по-прежнему применим, вам просто нужно больше кода знать наверняка. Например, гарантирует ли реализация NotificationCenter никогда не возвращать null? Если это так, используйте это как основание равных – JohnnyO

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; } 
} 
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 
      } 
    } 
Смежные вопросы