【问题标题】:Labeled Continue statement fails to compileLabeled Continue 语句编译失败
【发布时间】:2017-08-10 15:08:03
【问题描述】:
import java.util.Scanner;
class testing
{
    int i ; int j ;
    Scanner sc = new Scanner(System.in) ;
    void lolwa()
    {
        out:
        for(i = 0 ; i <= 6 ; i++)
        {
            System.out.println(i);
        }
        System.out.println("Enter 1 to restart loop");
        System.out.println("Enter 2 to continue till 10");
        j = sc.nextInt();
        if(j == 1)
        {
            continue out ;
        }
        if(j == 2)
        {
            for(i = 7 ; i <= 10 ; i++)
            {
                System.out.println(i);
            }
        }
    }
}

我在 BlueJ 中编译它,上面写着:“未定义标签”。我刚学会使用 continue 语句,所以我无法弄清楚问题

【问题讨论】:

  • 一个奇怪的问题:为什么不直接调用lolwa() 而不是使用 continue 呢?
  • 您的 continue 是在带有标签的循环已经完成之后。您是否不小心放错了牙套?
  • 你应该正确缩进你的代码 - continue 需要在一个循环中。
  • continue 语句必须包含在一个循环中(它不是),并且引用的标签必须在包含continue 语句的循环之外声明(同样,它不是)。在 Java 中也几乎不需要使用标签。
  • @assylias:我在上面没有看到任何缩进问题...? (其他问题,是的,但是...)

标签: java continue


【解决方案1】:

您的 out 标签“注释”了这个 for 循环:

out:
for(i = 0 ; i <= 6 ; i++)
{
    System.out.println(i);
}

所以为了继续使用标签out,它需要在那个for循环中。在 for 循环结束后使用它是没有意义的。这将编译,例如:

out:
for(int i = 0; i <= 6; i++)
{
    System.out.println(i);
    continue out;
}

但是,在这种情况下,您不需要带标签的 continue 语句。没有歧义。只有一个循环可以“继续”出来。

Oracle tutorial 很好地解释了它。


值得一提的是,我什至不记得上次我不得不使用标记为 continue 是什么时候了——也许永远不会。除非您几乎别无选择,否则我会避免使用它们。

【讨论】:

  • 我只能假设它是来自程序集的 JSR 命令(例如)的残余。我以前使用过它们,因为实际上没有其他选择。 IMO 使用标签来控制 Java 等高级语言中的逻辑流,这表明几乎在每一种情况下都是糟糕的设计。
  • 存在有限的嵌套循环用例,其中替代方案(标志变量和/或冗余检查)不必要地使代码复杂化。他们很少而且相距甚远。 :-)
  • @Michael 我不知道你为什么要用 break 语句来演示它。 TO正在使用继续。演示以相同的方式应用,但仍然:p
【解决方案2】:

我认为你没有得到continue label的使用:它必须在循环中使用,并且用于跳转到你的特定标签。 if 语句不是循环。只需调用lolwa() 替换您的continue out,您将获得所需的行为:您将被发送到函数的开头。

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 2011-10-09
    • 1970-01-01
    • 2016-11-20
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多