0

我一直盯着我的屏幕看了一会儿,在这种情况下我确实需要对标记循环进行解释:

package com.misterkourouma.oca8.starter.test;

public class LabeledLoop{

    public static void main(String[] args) {
        int x = 5, j = 0;
        OUTER: for (int i = 0; i < 3;) // -> This line has no curly braces but still compiles
            INNER: do {
                i++;
                x++;
                if (x > 10)
                    break INNER;
                x += 4;
                j++;
            } while (j <= 2);

        System.out.println(x);
    }
}

但是这个不能编译:

package com.misterkourouma.oca8.starter.test;

public class LabeledLoop2{
    public static void main(String[] args) {
        int x = 5, j = 0;
        OUTER: for (int i = 0; i < 3;)
            System.out.println("Labeled Loop");
            INNER: do {
                i++;
                x++;
                if (x > 10)
                    break INNER;
                x += 4;
                j++;
            } while (j <= 2);
        System.out.println(x);
    }
}

所有的INNER:块都被认为(我猜)是一个单一的语句,但它不以分号结尾我想知道为什么?

我正在为 OCA 8 做准备,这也是我需要了解这些怪事的原因之一。

编辑:
我的问题是关于 LabeledLoop 示例为什么它编译
提前感谢您的帮助。

4

4 回答 4

2

根据我的理解,您将在以下语句中收到编译错误:

 i++;

这是因为您没有在OUTER: for (int i = 0; i < 3;)语句中创建任何块(通过使用花括号{}),因此,默认情况下,OUTER 循环的范围保持到下一个语句(在您的情况下为 at System.out.println("Labeled Loop");)。当您i在三个 statements 之后增加变量时,它会给您编译错误,说明i未声明。

于 2018-08-08T05:26:18.537 回答
0

如果 for 循环后没有大括号 - 则认为只有第一个表达式在循环内。所以第一个例子相当于

        OUTER: for (int i = 0; i < 3;){
            INNER: do {
                i++;
                x++;
                if (x > 10)
                    break INNER;
                x += 4;
                j++;
            } while (j <= 2);
        }
        System.out.println(x);

变量 i 在 for 循环中声明。在第一个示例中,do-while 位于 for 循环内,因此一切正常。第二个例子相当于

        OUTER: for (int i = 0; i < 3;){
            System.out.println(x);
        }
        INNER: do {
                i++;
                x++;
                if (x > 10)
                    break INNER;
                x += 4;
                j++;
        } while (j <= 2);

所以变量 i 超出范围并且未在 while 循环中声明

于 2018-08-08T05:33:22.900 回答
0

花括号在 Java 中很重要,而缩进则不重要。

这段代码:

public static void main(String[] args) {
    int x = 5, j = 0;
    OUTER: for (int i = 0; i < 3;)
        System.out.println("Labeled Loop");
        INNER: do {
            i++;
            x++;
            if (x > 10)
                break INNER;
            x += 4;
            j++;
        } while (j <= 2);
    System.out.println(x);
}

方法:

public static void main(String[] args) {
    int x = 5, j = 0;
    OUTER: for (int i = 0; i < 3;)
        System.out.println("Labeled Loop");
    INNER: do {
        i++;
        x++;
        if (x > 10)
            break INNER;
        x += 4;
        j++;
    } while (j <= 2);
    System.out.println(x);
}

这当然不会编译。

于 2018-08-08T05:29:46.917 回答
0

您错过了 for 循环周围的 {} 大括号。这就是原因,代码没有编译。它没有识别变量 i。因为我的范围是

OUTER: for (int i = 0; i < 3;) {
                    System.out.println("Labeled Loop") only

     public static void main(String[] args) {
                int x = 5, j = 0;
                OUTER: for (int i = 0; i < 3;) {
                    System.out.println("Labeled Loop");
                    INNER: do {
                        i++;
                        x++;
                        if (x > 10)
                            break INNER;
                        x += 4;
                        j++;
                    } while (j <= 2);
                System.out.println(x);
                }
            }
于 2018-08-08T05:27:35.683 回答