Java for-each 循环抛出 NullPointErexception

标签 java loops for-loop

以下 java 段将导致 NullPointException,因为变量列表为 null,传递给 for-each 循环。

List<> arr = null;
for (Object o : arr) {
    System.out.println("ln "+o);
}

我认为for (Object o : arr){ }相当于

for (int i = 0; i < arr.length; i++) { }

和/或

for (Iterator<type> iter = arr.iterator(); iter.hasNext(); ){ 
   type var = iter.next(); 
}

无论哪种情况,arr 为 null 都会导致 arr.length 或 arr.iterator() 抛出 NullPointException

我只是好奇 for (Object o : arr){ } 的原因不是翻译成

if (arr!=null){
  for (int i = 0; i < arr.length; i++) { 
  }
}
and
if (arr!=null){
    for (Iterator<type> iter = arr.iterator(); iter.hasNext(); ){ 
       type var = iter.next(); 
    }
}

包含 arr!=null 表达式可以减少代码嵌套。

最佳答案

我看到以下原因,虽然我不知道是否有人考虑过这一点,何时实现,以及实际原因是什么。

  1. 正如您所演示的,for(:) 循环的当前行为非常容易理解。其他行为不是

  2. 这将是 java 世界中唯一以这种方式运行的东西。

  3. 它不等同于简单的 for 循环,因此在两者之间迁移实际上不等价

  4. 无论如何,使用 null 是一个坏习惯,因此 NPE 是告诉开发人员“你他妈的,清理你的烂摊子”的好方法,而建议的行为只会隐藏问题。

  5. 如果您想在循环之前或之后对数组执行任何其他操作,该怎么办...现在您的代码中将进行两次空值检查。

关于Java for-each 循环抛出 NullPointErexception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16259435/

相关文章:

javascript - 在 Javascript 的 for 循环中重置同一计时器的超时

for-loop - lua for 循环使用

java - 我如何在 Java 中反转这种模式?

java - 使用 XMPP、Spark 或 SparkWeb java 的 Facebook 聊天应用程序

java - 来自 Java 的 Qt Android : How to call Toast. makeText?

loops - 如何在 Lua 中的二维表上创建迭代器?

java - 查找连续出现两次的最大字符

Eclipse 中的 C# SLN 文件方法 (Java)

loops - Haskell - 每个矩阵中每个元素之间的差异之和

javascript - 如何在 node.js 中的 for 循环中编写回调函数