对于空列表中的每个循环

时间:2018-03-23 08:51:29

标签: java foreach

如果我们在空集合中执行foreach循环,则不会执行任何操作。但是当集合为空时,应该如何处理案例中的结构呢?

Collection<String> c=null;
....
for(String item:c){
   println(item);
}

我可以运行代码并查看null引用异常。但究竟应该是什么行为呢?我无法找到任何关于此的手册页。

我知道在头部抛出了异常,因为该集合为null。但我想知道如何抛出异常。它可以通过if,或者通过Objects.requireNonNull(),或者通过其他方式完成,或者在David的答案中显示。

4 个答案:

答案 0 :(得分:7)

在编译后使用增强的(或foreach)IteratorJLS所述的方式迭代集合:

  

增强的for语句相当于一个基本的for语句   形式:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
    {VariableModifier} TargetType Identifier =
        (TargetType) #i.next();
    Statement
}

您可以在编译后查看循环的反汇编代码来检查自己是否是javap -c):

  3: invokeinterface #2,  1            // InterfaceMethod java/util/Collection.iterator:()Ljava/util/Iterator;
  8: astore_2
  9: aload_2
 10: invokeinterface #3,  1            // InterfaceMethod java/util/Iterator.hasNext:()Z
 15: ifeq          38
 18: aload_2
 19: invokeinterface #4,  1            // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
 24: checkcast     #5                  // class java/lang/String
 27: astore_3
 28: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;
 31: aload_3
 32: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
 35: goto          9

所以,就像你写的那样:

Collection<String> c = null;
for (Iterator<String> iterator = c.iterator(); iterator.hasNext();) {
    String item = iterator.next();          
}

iterator()上调用null会引发NullPointerException

答案 1 :(得分:2)

它应抛出异常 - 简单明了。

答案 2 :(得分:1)

foreach循环编译为基于iteratorindex的循环幕后循环。只要iterator引用NullPointerException引用null,就会引用Iterable object引用null。但是,为什么foreach检查不包含在java empty list的实现中是另一个问题。但我认为,它使null listauto-gui之间的区别更加清晰,后者表示某些事情已经出错。

答案 3 :(得分:0)

它将抛出NullPointerException,因为collection为null,并且您正在尝试迭代引用null的集合。如果collection为空,那么它不会抛出异常,代码也能正常工作。