如果我们在空集合中执行foreach循环,则不会执行任何操作。但是当集合为空时,应该如何处理案例中的结构呢?
Collection<String> c=null;
....
for(String item:c){
println(item);
}
我可以运行代码并查看null引用异常。但究竟应该是什么行为呢?我无法找到任何关于此的手册页。
我知道在头部抛出了异常,因为该集合为null。但我想知道如何抛出异常。它可以通过if,或者通过Objects.requireNonNull(),或者通过其他方式完成,或者在David的答案中显示。
答案 0 :(得分:7)
在编译后使用增强的(或foreach)Iterator
以JLS所述的方式迭代集合:
增强的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
循环编译为基于iterator
或index
的循环幕后循环。只要iterator
引用NullPointerException
引用null
,就会引用Iterable object
引用null
。但是,为什么foreach
检查不包含在java empty list
的实现中是另一个问题。但我认为,它使null list
与auto-gui
之间的区别更加清晰,后者表示某些事情已经出错。
答案 3 :(得分:0)
它将抛出NullPointerException,因为collection为null,并且您正在尝试迭代引用null的集合。如果collection为空,那么它不会抛出异常,代码也能正常工作。