【问题标题】:Why Java permits labels positioned far from a loop?为什么 Java 允许标签远离循环?
【发布时间】:2013-02-25 19:14:46
【问题描述】:

我正在用 JAVA 编码,突然我写了一些这样的代码:

int x = 10;
boolean b = true;

l1: b = x > 1;

l2: while (b) {

    // some code
    break l2;
}

令我惊讶的是,代码编译并正常运行。我对我的l1 标签什么也没做,但为什么它可以用这个语句正确编译?

我知道 java 中的 goto 存在但未使用 (Java Language Keywords) 但无论如何我可以跳转到它吗?

【问题讨论】:

  • 标签在这里用于您想要跳出许多嵌套循环的情况。您将无法转至l1
  • Iirc,这是因为您可能有 2 个嵌套循环,并且您可能想要突破到外部循环。
  • 为什么你认为它不应该工作?如果语法正确,它应该可以编译。
  • @VishalK 它什么也没做
  • 我的错误。这是错误的说法..

标签: java loops syntax goto


【解决方案1】:

任何语句都可以标注,但they are only useful in conjunction with break or continue:

与 C 和 C++ 不同,Java 编程语言没有 goto 语句;标识符语句标签与出现在标记语句中的任何位置的 break (§14.15) 或 continue (§14.16) 语句一起使用。

换句话说,为了可用,标签需要应用于包含 break 或 continue 的语句,而后者又可以是循环,或者,仅对于 break,任何块。

【讨论】:

  • 据我了解,编译器之所以不抱怨标签不可达是因为Java设计者希望将来有可能使标签更有用,可能通过使用“goto”语句目前已保留,无用。
  • 这两种休息方式非常不同。 "break label" 可以从任何块中中断,例如 `abc:{ break abc; } `
  • @EyalSchneider 如果是这样的话,我会感到惊讶。你有证据吗?真正的原因更有可能是因为它会使语法变得非常复杂,只允许在某些类型的语句上使用标签。
【解决方案2】:

不,没有办法跳回l1 并继续执行。正如您所说,goto 是一个未使用的关键字。标签仅用于将循环标记为break/continue

如果你真的想“跳”到它,可以通过递归等其他编程技术来做到这一点。

即,如果您想跳回 l1 而不是仅仅中断 l2...

public void myMethod() {
    b = x > 1;

    while (b) {
        // some code
        myMethod();
    }
}

请务必添加您的退货条件。

【讨论】:

    【解决方案3】:

    如果你想摆脱很多循环,你可以使用带标签的 continue 语句。您的代码的解决方法是这样的。

    int x = 10;
    boolean b = true;
    
    l1:
      for(int i=1;i>0;i--) { b = x > 1;
    
           l2: while (b) {
               // some code
               //break l2;
               i++;continue l1;
           }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多