如何正确使用goto语句

我正在上高中AP计算机科学课。

我决定把一个goto语句放到我们的一个实验室里来玩,但是我得到了这个错误。

 Exception in thread "main" java.lang.Error: Unresolved compilation problems: Syntax error on token "goto", assert expected restart cannot be resolved to a variable at Chapter_3.Lab03_Chapter3.Factorial.main(Factorial.java:28) 

我在Stackoverflow上转到了一个goto问题,以了解如何正确地完成它,并且我完全按照其中一个答案进行了演示。 我真的不明白为什么编译器想要一个assert语句(至少这是我认为它想要的),我也不知道如何使用assert 。 它似乎想重启部分goto restart; 作为变量,但重新启动只是一个标签,将程序拉回到第10行,以便用户可以输入有效的int 。 如果它想重新启动变量,我该怎么做?

 import java.util.*; public class Factorial { public static void main(String[] args) { int x = 1; int factValue = 1; Scanner userInput = new Scanner(System.in); restart: System.out.println("Please enter a nonzero, nonnegative value to be factorialized."); int factInput = userInput.nextInt(); while(factInput<=0) { System.out.println("Enter a nonzero, nonnegative value to be factorialized."); factInput = userInput.nextInt(); } if(x<1)//This is another way of doing what the above while loop does, I just wanted to have some fun. { System.out.println("The number you entered is not valid. Please try again."); goto restart; } while(x<=factInput) { factValue*=x; x++; } System.out.println(factInput+"! = "+factValue); userInput.close(); } } 

正如已经在所有答案中指出的那样 – 在Java保留的单词并没有在语言中使用。

restart:被称为标识符,后跟冒号。

如果您希望实现similar行为,您需要注意以下几点:

 outer: // Should be placed exactly before the loop loopingConstructOne { // We can have statements before the outer but not inbetween the label and the loop inner: loopingConstructTwo { continue; // This goes to the top of loopingConstructTwo and continue. break; // This breaks out of loopingConstructTwo. continue outer; // This goes to the outer label and reenters loopingConstructOne. break outer; // This breaks out of the loopingConstructOne. continue inner; // This will behave similar to continue. break inner; // This will behave similar to break. } } 

我不确定我是否应该像我已经说过的那样similar

Java关键字列表指定goto关键字,但它被标记为“未使用”。

这可能是为了将它添加到更高版本的Java中。

如果goto不在列表中,并且稍后将其添加到语言中,则使用单词goto作为标识符(变量名,方法名等)的现有代码将会中断。 但是因为goto是一个关键字,这样的代码甚至不能在当前编译,并且它仍然可以使它实际上稍后执行某些操作,而不会破坏现有代码。

如果您继续查看并断开,则接受“标签”。 试验一下。 转到本身是行不通的。

 public class BreakContinueWithLabel { public static void main(String args[]) { int[] numbers= new int[]{100,18,21,30}; //Outer loop checks if number is multiple of 2 OUTER: //outer label for(int i = 0; i 

阅读更多

Java不支持goto ,它被保留为关键字,以防他们想要将其添加到更高版本

goto在Java中没有做任何事情。

Java也不使用行号,这是GOTO函数的必需品。 与C / C ++不同,Java没有goto语句,但java支持label。 标签在Java中有用的唯一位置就在嵌套循环语句之前。 我们可以使用break指定标签名称以打破特定的外部循环。

Java世界中没有’goto’。 主要原因是开发人员意识到具有goto的复杂代码会导致代码变得非常可悲,并且几乎不可能增强或维护代码。

但是,这个代码可以稍微修改一下,使用continue和break的概念,我们可以使代码工作。

  import java.util.*; public class Factorial { public static void main(String[] args) { int x = 1; int factValue = 1; Scanner userInput = new Scanner(System.in); restart: while(true){ System.out.println("Please enter a nonzero, nonnegative value to be factorialized."); int factInput = userInput.nextInt(); while(factInput<=0) { System.out.println("Enter a nonzero, nonnegative value to be factorialized."); factInput = userInput.nextInt(); } if(x<1)//This is another way of doing what the above while loop does, I just wanted to have some fun. { System.out.println("The number you entered is not valid. Please try again."); continue restart; } while(x<=factInput) { factValue*=x; x++; } System.out.println(factInput+"! = "+factValue); userInput.close(); break restart; } } }