繁体   English   中英

如何跳入Java

[英]How to jump in java

我有这样的代码

public class Test
{

    public static void main(String[] args)
    {
        continue s;
        System.out.println("I am not supposed to print this");
        s:
        System.out.println("I am suppose to print this");

    }
}

我得到错误

java: undefined label: s

怎么了 ?

在Java中不可能像这样跳跃,唯一的跳跃方式是从循环,while和do。

阅读@Heinzi的答案

2.2.6没有更多的Goto语句

Java没有goto语句 研究表明,goto被(误用)的原因不只是“因为它存在”而被更多地使用。 取消goto导致语言的简化-例如,在for语句的中间没有关于goto效果的规则。 对大约100,000行C代码的研究确定,大约90%的goto语句仅用于获得摆脱嵌套循环的效果。 如上所述,多级中断并继续删除了对goto语句的大部分需求。

Java语言环境,James Gosling和Henry McGilton,1996年

Java中没有“ goto”。 而“继续”还有其他功能。 您可以在循环中使用“ continue”,例如:

class ContinueDemo {
    public static void main(String[] args) {

        String searchMe = "peter piper picked a " + "peck of pickled peppers";
        int max = searchMe.length();
        int numPs = 0;

        for (int i = 0; i < max; i++) {
            // interested only in p's
            if (searchMe.charAt(i) != 'p')
                continue;

            // process p's
            numPs++;
        }
        System.out.println("Found " + numPs + " p's in the string.");
    }
}

在上面的示例中,例如,如果searchMe.charAt(5) != 'p'则循环将从i = 6和numPs++;的循环开始处继续numPs++; 将不会被处理。

您可以在此处阅读有关此内容的更多信息: 分支语句

continue是Java中的关键字,用于跳过循环的迭代。 如果您试图找到与GOTO等效的产品,则应重新考虑如何解决问题, GOTO永远不是有效的选择。

据我所知,Java中没有goto(有一个关键字,但没有任何意义)

基本上,在Java中没有实际的方法可以做到这一点。 您似乎正在尝试执行等效的“ goto”操作,而Java不支持该功能。 break labelcontinue label语句只能分支到封闭的带标签语句。

现在,根据Java正式语法,您可以编写以下代码:

  s: {
      continue s;
      System.out.println("I am not supposed to print this");
  }
  System.out.println("I am suppose to print this");

但这仍然无法编译,原因有二:

  • 仅允许继续分支到循环语句上的标签。 break没有那个限制...但是...)

  • continue (或break )使下一条语句不可访问。

另请参见: Java中goto语句的替代方法


但是有一种相当棘手的方法可以使您的代码“起作用”:

  static final boolean flag = true;  // class attribute ...

  ...

  s: {
      if (flag) break s;
      System.out.println("I am not supposed to print this");
  }
  System.out.println("I am suppose to print this");

编译器将对“测试”进行评估,以使break实际上是无条件的。 但是JLS表示,第一个println将被视为可访问的,因此您不会遇到无法访问的代码错误。

我想如果您生成此源代码,这可能会很有用。 除此之外,这只是(IMO)的好奇心。 使用常规的if / else语句...或通过完全删除第一个“打印”来进行此操作更为简单。

从理论上讲,Java具有Jump语句returnbreak

return语句会跳出一个方法,无论是否将值返回给调用语句。

break语句跳出循环。

正如前面的答案中提到的那样, goto在Java中不可用,并且不被视为过程式或面向对象编程中的良好编程习惯。 它存在于顺序编程时代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM