对于空列表中的每个循环

Gan*_*nus 4 java foreach

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

Collection<String> c=null;
....
for(String item:c){
   println(item);
}
Run Code Online (Sandbox Code Playgroud)

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

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

dav*_*xxx 7

在编译后使用增强的(或foreach)根据JLS的Iterator规定迭代集合:

增强的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();          
}
Run Code Online (Sandbox Code Playgroud)

调用iterator()null抛出所以NullPointerException.