List<Integer> list = new ArrayList<>();
list.add(12);
list.add(null);
list.add(22);
list.add(32);
System.out.println(list);
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
Integer a = iterator.next();
System.out.print(a+" ");
if(a.equals(32)){
iterator.remove();
}
}
O / P
[12, null, 22, 32]
12 null Exception in thread "main" java.lang.NullPointerException
at javed.collection.Collecting.main(Collecting.java:57)
尝试从包含null的List中删除任何元素会给我NullPointerException。 但是可以轻松地从List中包含不带null的元素。 我通过将整数与null进行比较来做错事吗?
如果我们不能从List中删除包含null的元素,而不是它们允许我们在List中添加null的原因,那么它的用途是什么。
答案 0 :(得分:2)
你应该添加一个空检查:
if(a != null && a.equals(32)) {
iterator.remove();
}
您还可以使用Objects.equals
为您执行空检查:
if(Objects.equals(a, 32)) {
答案 1 :(得分:0)
更改条件语句:
if(a.equals(32)){
iterator.remove();
}
为:
Integer toCheck = 32;
if(toCheck.equals(a)){
iterator.remove();
}
避免可能的空引用
答案 2 :(得分:0)
如果您在null
变量上调用任何方法,则会获得NullPointerException
。这意味着,如果a
为null
并且您尝试拨打a.equals(32)
,那么它将是NPE。
您只需输入:
即可对变量进行空值检查if (a!=null && a==32) {
//whatever
}
另一方面,您不必手动遍历列表以从中删除特定元素。有一种方法可以帮到你:
list.remove(Integer.valueOf(32));
答案 3 :(得分:0)
您绝对可以从包含空引用的列表中删除 - 您无法在空引用上调用equals
。问题出在这里:
if(a.equals(32))
如果NullPointerException
为a
,则null
会失败。关于那个没有没有特定于列表的列表。如果没有列表或迭代器,您可以获得完全相同的行为:
Integer a = null;
if (a.equals(32)) // Bang!
...
最简单的修复方法是检查无效:
if (a != null && a == 32)
(比较现在使用拆箱,而不是每次迭代时装箱32 - 这仍然很便宜,但不是可读的IMO。)
或者以盒装Integer
值开头:
Integer valueToRemove = 32;
while(iterator.hasNext()){
Integer a = iterator.next();
System.out.print(a+" ");
if(valueToRemove.equals(a)) {
iterator.remove();
}
}
答案 4 :(得分:0)
你可以这样做:
if (a != null && a == 32) {
iterator.remove();
}
但由于a
的隐含框/取消框,这不是一个好习惯。
最快的方式是:
Iterator<Integer> iterator = list.iterator();
Integer matcher = 32;
while(iterator.hasNext()){
Integer a = iterator.next();
System.out.print(a+" ");
if(matcher.equals(a)){
iterator.remove();
}
}
答案 5 :(得分:0)
此行将从列表中删除所有空值
list.removeAll(Collections.singleton(null));