Как избежать ошибки нулевого указателя - PullRequest
0 голосов
/ 01 апреля 2010

Я пытаюсь найти, совпадают ли элементы 2 arrayLists. Но этот код выдает ошибку Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException, так как некоторые элементы имеют значение null.

Как я могу решить эту проблему?

String level []={"High","High","High","High","High","High"};
ArrayList<Object> n = new ArrayList<Object>(Arrays.asList(level));

String choice []={null,"High","Low","High",null,"Medium"}; 
ArrayList<Object> m = new ArrayList<Object>(Arrays.asList(choice));

//Check if the two arrayList are identical
for(int i=0; i<m.size(); i++){
   if(!(m.get(i).equals(n.get(i)))){   
 result= true;
 break;
   } 
} 
    return  result;
}

Ответы [ 8 ]

8 голосов
/ 01 апреля 2010

Просто используйте Arrays.equals, вот так:

    String level []={"High","High","High","High","High","High"};

    String choice []={null,"High","Low","High",null,"Medium"}; 

    return Arrays.equals(level, choice); 
6 голосов
/ 01 апреля 2010

Проблема в том, что вы вызываете метод equals для некоторых элементов без предварительной проверки на null.

Изменить на:

for(int i=0; i<m.size(); i++){
   if(m.get(i) != null && !(m.get(i).equals(n.get(i)))){   
     result = true;
     break;
   } 
} 

Или, если вы хотите, чтобы два null значения сравнивались равными:

for(int i=0; i<m.size(); i++){
   if (m.get(i) == null) {
     if (n.get(i) != null) {
       result = true;
     }
   } else if(!(m.get(i).equals(n.get(i)))){   
     result = true;
   } 
   if (result) {
     break;
   }
} 

Одна вещь, которую я не понимаю - почему вы устанавливаете результат в true, когда вы обнаружите несоответствие? Разве вы не хотите возвращать true, если оба списка совпадают, и false в противном случае?

2 голосов
/ 01 апреля 2010

Корень этой проблемы может быть в том, что вы используете нулевое значение в качестве фактического значения.

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

Проверьте это: http://java.sun.com/docs/books/tutorial/java/javaOO/enum.html

Также старайтесь избегать использования массивов. Просто используйте список, но используйте правильный тип. Не используйте List<Object>, который почти никогда не действителен.

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

1 голос
/ 01 апреля 2010

Сначала проверьте, являются ли объекты одним и тем же объектом (или оба равны нулю). Проверьте на нулевое значение перед выполнением теста equals ().

    boolean result = true;
    String level[] = { "High", "High", "High", "High", "High", "High" };
    ArrayList<String> n = new ArrayList<String>(Arrays.asList(level));

    String choice[] = { null, "High", "Low", "High", null, "Medium" };
    ArrayList<String> m = new ArrayList<String>(Arrays.asList(choice));

    // Check if the two arrayList are identical
    for (int i = 0; i < m.size(); i++) {
      String mElement = m.get(i);
      String nElement = n.get(i);

      if (mElement == nElement) {
        result = true;
      } else if ((mElement == null) || (nElement == null)) {
        result = false;
        break;
      } else if (!(m.get(i).equals(n.get(i)))) {
        result = false;
        break;
      }
    }

    return result;
  }
1 голос
/ 01 апреля 2010

, если вы знаете, что первый список никогда не содержит нулей, переключите вызов на

if(!(n.get(i).equals(m.get(i)))){ 

также указание ArrayList<Object> - это плохая практика, используйте List<String>, если это на самом деле String объекты.

0 голосов
/ 20 февраля 2015

Удалить NULL

Вы можете удалить значения NULL из ваших List объектов перед обработкой.

myList.removeAll( Collections.singleton( null ) );

Класс Collections представляет собой набор удобных служебных методов. Не путать с Collection (единственное число), интерфейсом которого является родительский List и реализован ArrayList.

См. Эту публикацию, Удаление всех нулей из списка в Java , для дальнейшего обсуждения.

0 голосов
/ 01 апреля 2010

Вместо того, чтобы решать эту конкретную проблему, дайте себе инструмент, который вы можете использовать снова и снова, например ::

public static final boolean areEqual(Object o1, Object o2) {
    return o1 == null ? o2 == null : o1.equals(o2);
}

... в каком-нибудь удобном служебном классе, затем используйте это в своем цикле.

Но, конечно, для этого специфического требования деривация имеет правильный ответ (используйте java.util.Arrays.equals(Object[],Object[])).

0 голосов
/ 01 апреля 2010

Перепишите ваш if следующим образом, чтобы проверить как двойную нулевую, так и единственную нулевую:

if((m.get(i) == null && n.get(i) == null) || (m.get(i) != null && !(m.get(i).equals(n.get(i)))))
...