以下简单示例会导致编译时错误。但目前尚不清楚原因。
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;
}
}
}
但以下工作正常:
public static void main (String[] args) throws java.lang.Exception
{
int i = 0;
d:
while(i < 10){
{
System.out.println("d");
}
i++;
continue d;
}
}
是否允许将控制转移到唯一的while
,for
或do
声明?它没有在 JLS 中说明。实际说的是:
带有标签标识符的continue语句尝试传输 控制到具有相同标签的封闭标签声明(第14.7节) 标识符作为其标签;那句话,叫做继续 target,然后立即结束当前迭代并开始一个新的 之一。
答案 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)