如何避免空指针错误

时间:2010-04-01 16:28:15

标签: java null pointers arraylist

我试图找出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 个答案:

答案 0 :(得分:8)

只需使用Arrays.equals,就像这样:

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

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

    return Arrays.equals(level, choice); 

答案 1 :(得分:6)

问题是您在没有先检查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 :(得分:2)

此问题的根源可能是您使用null作为实际值。

只需查看代码,就可以使用enum而不是null使用EMPTY值。然后你可以在没有nullpointerexceptions的列表中进行比较。

检查一下: http://java.sun.com/docs/books/tutorial/java/javaOO/enum.html

还要尽量避免使用数组。只需使用List但使用正确的类型。不要使用几乎永远无效的List<Object>

null应指示错误或仅测试。它永远不应该在有效代码中使用,因为您将在运行时创建空指针异常错误。

答案 3 :(得分:1)

如果您知道第一个列表永远不会包含空值,请切换调用

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

同时指定ArrayList<Object>是不好的做法,如果它是List<String>个对象,请使用String

答案 4 :(得分:1)

首先检查对象是否是同一个对象(或两者都是null)。在执行equals()测试之前检查null。

    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;
  }

答案 5 :(得分:0)

重写你的if,以便检查双重无效和单一无效:

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

答案 6 :(得分:0)

不要解决这个具体问题,而是给自己一个可以反复使用的工具,例如:

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

...在一些方便的实用程序类中,然后在循环中使用它。

但当然,对于此特定的要求,derivation具有right answer(使用java.util.Arrays.equals(Object[],Object[]))。

答案 7 :(得分:0)

删除NULL

您可以在处理之前从List对象中删除NULL值。

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

Collections类是一组方便的实用方法。不要与Collection(单数)混淆,父亲List的界面由ArrayList实现。

有关详细讨论,请参阅此帖子Removing all nulls from a List in Java