while循环中标记的continue语句

时间:2014-10-14 11:34:36

标签: java

以下简单示例会导致编译时错误。但目前尚不清楚原因。

public static void main (String[] args) throws java.lang.Exception
{
    int i = 0;
    d:
    {
        System.out.println("d");
    }
    while(i < 10){

        i++;
        continue d;

    }
}

- 和 -

public static void main (String[] args) throws java.lang.Exception
{
    int i = 0;
    d:
    {
        System.out.println("d");
        while(i < 10){
            i++;
            continue d;
        }
    }
}

DEMO

但以下工作正常:

public static void main (String[] args) throws java.lang.Exception
{
    int i = 0;
    d:
    while(i < 10){
        {
            System.out.println("d");
        }
        i++;
        continue d;

    }
}

是否允许将控制转移到唯一的whilefordo声明?它没有在 JLS 中说明。实际说的是:

  

带有标签标识符的continue语句尝试传输   控制到具有相同标签的封闭标签声明(第14.7节)   标识符作为其标签;那句话,叫做继续   target,然后立即结束当前迭代并开始一个新的   之一。

2 个答案:

答案 0 :(得分:5)

continue表示转到循环的开头。因此,当您continue到标签时,标签必须在循环上。 (这不是goto声明......)


  

是否允许将控制转移到only,for或do语句?它没有在JLS中说明。

实际上,确实如此。

以下是JLS 14.6(Java 8修订版)真正所说的内容:

  

“带有标签标识符的continue语句尝试将控制转移到与其标签具有相同标识符的封闭标记语句(第14.7节);该语句称为继续目标,然后立即结束当前迭代并开始一个新的。

     

准确地说,带有标签Identifier的continue语句总是突然完成,原因是继续使用标签Identifier。

     

continue目标必须是while,do或for语句,否则会发生编译时错误。

(粗体原文!)

粗体句子说标签所附的声明(称为“继续目标”)必须是某种循环声明。

答案 1 :(得分:3)

  

<强> JLS 14.16

     

一个continue语句可能只在while,do或for语句中发生(迭代语句);

     

continue目标必须是while,do或for语句,否则会发生编译时错误。


  

带有标签标识符 的continue语句尝试传输   控制具有相同标签的封闭标签声明 (§14.7)   标识符作为其标签;该声明,,称为继续   目标, 然后立即结束当前迭代并开始新的   之一。


  

continue语句必须立即引用标签   封闭方法,构造函数或初始化程序。 没有非本地的   跳转。如果没有带标识符的标签语句作为其标签   立即封闭方法,构造函数或初始化程序包含   continue语句,发生编译时错误