Java 使用迭代器从包含null的列表中删除元素

Java 使用迭代器从包含null的列表中删除元素,java,collections,null,core,Java,Collections,Null,Core,尝试从包含null的列表中删除任何元素都会导致NullPointerException。 但可以很容易地从不包含null的列表中删除元素。 我比较整数和空值是不是做错了 如果我们不能从包含null的列表中删除元素,那么为什么他们允许我们在列表中添加null,这有什么用呢 您应该添加一个空检查: [12, null, 22, 32] 12 null Exception in thread "main" java.lang.NullPointerException at javed.collecti

尝试从包含null的列表中删除任何元素都会导致NullPointerException。 但可以很容易地从不包含null的列表中删除元素。 我比较整数和空值是不是做错了


如果我们不能从包含null的列表中删除元素,那么为什么他们允许我们在列表中添加null,这有什么用呢

您应该添加一个空检查:

[12, null, 22, 32]
12 null Exception in thread "main" java.lang.NullPointerException
at javed.collection.Collecting.main(Collecting.java:57)
您还可以使用为您执行空检查的:

if(a != null && a.equals(32)) {
    iterator.remove();
}

将条件语句更改为:

if(Objects.equals(a, 32)) {
致:


为了避免可能的空引用

如果对
null
变量调用任何方法,将得到
NullPointerException
。这意味着如果
a
null
,并且您尝试调用
a.equals(32)
,它将NPE

只需输入以下内容,即可对变量进行空检查:

Integer toCheck = 32;
if(toCheck.equals(a)){  
    iterator.remove();
}
另一方面,您不必手动迭代列表以从中删除特定元素。有一种方法可以为您做到这一点:

if (a!=null && a==32) {
    //whatever
}
您完全可以从包含空引用的列表中删除—您不能对空引用调用
equals
。问题在于:

list.remove(Integer.valueOf(32));
如果
a
null
,则该操作将失败,出现
NullPointerException
。这方面没有具体的清单。在看不到列表或迭代器的情况下,您可以获得完全相同的行为:

if(a.equals(32))
最简单的修复方法是检查空值:

Integer a = null;
if (a.equals(32)) // Bang!
    ...
(现在比较使用拆箱,而不是在每次迭代中装箱32次——这仍然很便宜,但在我看来不那么可读。)

或者以一个装箱的
整数
值开头:

if (a != null && a == 32)
你可以这样做:

Integer valueToRemove = 32;
while(iterator.hasNext()){
    Integer a = iterator.next();
    System.out.print(a+" ");

    if(valueToRemove.equals(a)) {
        iterator.remove();
    }
}
但是这不是一个好习惯,因为
a
的隐式框/debox

最快的方法是:

if (a != null && a == 32) {
    iterator.remove();
}
Iterator Iterator=list.Iterator();
整数匹配器=32;
while(iterator.hasNext()){
整数a=迭代器.next();
系统输出打印(a+“”);
如果(匹配器等于(a)){
iterator.remove();
}
}

此行将从列表中删除所有空值

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

为什么您认为问题出在
remove
行中?嘿,thanx,如果(a!=null&&a==32)这很有效。
if (a != null && a == 32) {
    iterator.remove();
}
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();
    }
}
    list.removeAll(Collections.singleton(null));