我试图找出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;
}
答案 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)
您可以在处理之前从List
对象中删除NULL值。
myList.removeAll( Collections.singleton( null ) );
Collections
类是一组方便的实用方法。不要与Collection
(单数)混淆,父亲List
的界面由ArrayList
实现。
有关详细讨论,请参阅此帖子Removing all nulls from a List in Java。