我正在上高中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)
Run Code Online (Sandbox Code Playgroud)
我goto在Stackoverflow上找到了一个问题,以了解如何正确地完成它,并且我完全按照其中一个答案进行了演示.我真的不明白为什么编译器需要一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
Tir*_*ath 70
正如所有答案已经指出的那样goto- 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.
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定我是否应该similar像往常一样说.
Adi*_*ngh 12
在Java的关键字列表指定跳转关键字,但它被标记为"未使用".
这可能是为了将它添加到更高版本的Java中.
如果goto不在列表中,并且稍后将其添加到语言中,则使用单词goto作为标识符(变量名,方法名等)的现有代码将会中断.但是因为goto是一个关键字,这样的代码甚至不能在当前编译,并且仍然可以使它实际上稍后执行某些操作,而不会破坏现有代码.
Bil*_*l K 10
如果你继续查看并打破他们接受"标签".试验一下.转到本身是行不通的.
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<numbers.length; i++){
if(i % 2 == 0){
System.out.println("Odd number: " + i +
", continue from OUTER label");
continue OUTER;
}
INNER:
for(int j = 0; j<numbers.length; j++){
System.out.println("Even number: " + i +
", break from INNER label");
break INNER;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)