【问题标题】:Declaring Variable Outside Foreach Loop in Java在 Java 中的 Foreach 循环外声明变量
【发布时间】:2015-06-05 17:42:23
【问题描述】:

有人可以请教我以下问题:

public class Loopy {
    public static void main(String[] args)
    {
        int[] myArray = {7, 6, 5, 4, 3, 2, 1};

        int counterOne; 
        for (counterOne = 0; counterOne < 5; counterOne++) {
            System.out.println(counterOne + " ");
        }
        System.out.println(counterOne + " ");

        int counterTwo = 0; 
        for (counterTwo : myArray) {
            System.out.println(counterTwo + " ");
        }

    }

}

在for循环中,我们在循环外声明counterOne,并在循环内使用它。这是正确的,只要我们在循环完成后不使用counterOne即可。

在 foreach 循环中,我们还在循环外声明counterTwo,然后在循环内使用它。但是,在这种情况下会引发错误:

“线程“main”中的异常 java.lang.RuntimeException:无法编译 源代码 - 找不到符号符号:类计数器两个位置:类 package1.Loopy"

你能帮我理解为什么吗?

两者的唯一区别是counterOne被初始化为零,然后被增量赋值(小于5)。

在foreach循环中,counterTwo被一一赋值,每个数组项。

如果我们在第二个 for 循环中进行此调整,程序就可以工作:for(int counterTwo : myArray),而第一个 for 在这两种情况下都可以工作:

  1. 现有的
  2. for (counterOne = 0; counterOne &lt; 5; counterOne++)

【问题讨论】:

  • 我重命名了您代码中的变量,以方便可能遇到此问题的其他人阅读(我个人从未尝试过,发现它很有趣)。

标签: java for-loop foreach


【解决方案1】:

来自this section of the Java Language Specification关于增强for-loops:

增强的 for 语句具有以下形式:

EnhancedForStatement:

for ( {VariableModifier} UnannType VariableDeclaratorId : Expression ) Statement

EnhancedForStatementNoShortIf:

for ( {VariableModifier} UnannType VariableDeclaratorId : Expression ) StatementNoShortIf

请注意,类型声明 UnannType 必须出现在 for 循环中。因此,您应该编写如下循环:

for (int z : x) {

【讨论】:

    【解决方案2】:

    好吧,简单来说,第二个是“特殊”的,实际上是“每个人”。它总是需要里面的变量声明。 与其解释得很糟糕,不如在这里你是一个关于这个的旧问题的链接,检查一下: Why is declaration of the variable required inside a foreach loop

    【讨论】:

      【解决方案3】:

      这只是 for each 循环的语法。您不能在循环本身之外使用在 for each 循环中定义的变量。这就是语言的定义方式。

      https://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-12
        • 1970-01-01
        • 2014-06-15
        • 2015-08-31
        相关资源
        最近更新 更多