【问题标题】:How to use labels in java code?如何在java代码中使用标签?
【发布时间】:2015-02-07 10:48:01
【问题描述】:

在 java 代码的标签中使用 break 语句时出现错误。这显示undefined label。写这样的代码是错误的。请帮助我正确使用它。提前致谢。

 while (true)
          {
            label149: if (!localIterator2.hasNext());
            while (true)
            {
              i++;
              break;
              HashMap localHashMap2 = (HashMap)localIterator2.next();
              if (!((String)localHashMap1.get("name")).equalsIgnoreCase((String)localHashMap2.get("emotion")))
                break label149;
              if (!((String)localHashMap2.get("IS_paid")).equalsIgnoreCase("1"))
                break label246;
              ((HashMap)Saved.this.keynamedata.get(i)).put("is_paid", "1");
            }
            label246: ((HashMap)Saved.this.keynamedata.get(i)).put("is_paid", "0");
          }

【问题讨论】:

  • 呃,你的第一个 if... 后面多了一个分号
  • 基本上,它们不是可怕、可怕、可怕的编程方式,而且是非常糟糕设计的重要指标
  • @fge - 谢谢你 :) 但删除它得到另一个错误
  • 我完全不同意。标签是限制变量范围的好方法 - 重构其他人的懒惰编码的垫脚石。变量的作用域越受限制,代码就越容易理解。

标签: java label


【解决方案1】:

带有标签的breakgoto 语句不同。 Java 没有goto 语句。

标签标记了它后面的语句。您可以使用它来突破该语句,并且只能突破该语句。流程控制将始终转移到标记语句的末尾。

那么你这里有什么?

        label149: if (!localIterator2.hasNext());

因为 if 后面的分号,这实际上是整个带标签的语句。所以你的break label149 根本不在它的范围内。如果您没有该分号,if 块将包含while,然后break label149 将起作用。但控制权会转移到while 块结束后的行。

       label246: ((HashMap)Saved.this.keynamedata.get(i)).put("is_paid", "0");

这是 label246 标记的​​语句。同样,break label246 不在其中,因此它不在其范围内,您不能跳出不在其中的语句。

【讨论】:

  • 好吧,Java 确实 保留了goto 关键字...只是它什么都不做。
【解决方案2】:

借助 Break 和 continue,您可以在应用程序中有复杂循环的地方使用标签。但是总是建议避免使用标签,因为它变得难以阅读代码并且完全类似于一个糟糕的设计(还记得 goto (在其他语言中仍然是一个关键字)吗?)。标签的示例如下:

abc: for (;;) {
    for (;; i++) {
        if (i == 255) {
            break abc;
        }
    }
}
System.out.println("Noww i am back");

这表示我需要中断我标记为 abc 的循环。所以它会从外部 for 循环中出来。如果我在那里省略了 abc,那么它就会从最里面的循环中出来,即我说它要从中中断的第二个循环。你不能期望标签出现在代码中的任何地方。

【讨论】:

    【解决方案3】:

    标签中断语句终止当前循环并继续执行第一条语句 紧跟在由关键字 break 后面的标识符标记的循环之后。

    例如:

         for (int i=0; i<3; i++)
                {
                 resume:
                    for (……………)
                              {
                                     ……..
                                  if (……..) break resume;
                     }
        }
    

    【讨论】:

      【解决方案4】:

      java中的lable和c语言中的goto不一样

      在程序流程中,它们必须首先包含 label246: ,然后您才允许使用 break 或 continue 语句。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2010-09-05
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 2020-12-05
      • 1970-01-01
      相关资源
      最近更新 更多