如何正确使用转到语句

2022-09-01 09:09:28

我正在上高中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上的一个问题,以了解如何正确地做到这一点,我完全按照其中一个答案中演示的那样做了。我真的不明白为什么编译器想要一个语句(至少这是我假设它想要的),我也不知道如何使用。它似乎希望重新启动部分是一个变量,但重新启动只是一个标签,它将程序拉回第10行,以便用户可以输入有效的。如果它希望重新启动成为一个变量,我该怎么做?gotoassertassertgoto restart;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();
    }
}

答案 1

正如所有答案已经指出的那样 - 在语言中和未使用的保留字。gotoJava

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


答案 2

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

这可能是为了以防万一它被添加到Java的更高版本中。

如果goto不在列表中,并且后来被添加到语言中,那么使用单词goto作为标识符(变量名称,方法名称等)的现有代码将会中断。但是由于goto是一个关键字,这样的代码甚至不会在当前编译,并且仍然有可能使它以后实际做一些事情,而不会破坏现有的代码。


推荐