Java中的标记循环

时间:2018-08-08 05:20:36

标签: java loops labeled-statements

我一直盯着屏幕看了一段时间,在这种情况下,我确实需要标记循环的解释:

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 个答案:

答案 0 :(得分:2)

据我了解,您将在以下语句中得到编译错误:

 i++;

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

答案 1 :(得分: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);
                }
            }

答案 2 :(得分: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);
}

当然不会编译。

答案 3 :(得分: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循环中声明