如果我们在空集合中执行foreach循环,则不会采取任何操作.但是当集合为空时,应该如何处理案例中的结构呢?
Collection<String> c=null;
....
for(String item:c){
println(item);
}
Run Code Online (Sandbox Code Playgroud)
我可以运行代码并查看null引用异常.但究竟应该是什么行为呢?我找不到任何关于它的手册页.
我知道在头部抛出了异常,因为集合是null.但我想知道如何抛出异常.它可以通过if,或通过Objects.requireNonNull(),或以其他方式完成,或者如David的答案中所示.
在编译后使用增强的(或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.