我正在上我的高中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;
的restart部分是一个变量,但restart只是一个标签,它将程序拉回到第10行,以便用户可以输入一个有效的int
。如果它想让restart成为一个变量,我该怎么做?
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();
}
}
8条答案
按热度按时间rdlzhqv91#
正如所有答案所指出的那样
goto
-Java
中的保留字,并且在语言中不使用。restart:
被称为标识符,后跟冒号。如果您希望实现
similar
行为,需要注意以下几点:我不确定我是否应该说
similar
,因为我已经说了。gzszwxb42#
Java keyword list指定了后藤关键字,但它被标记为“未使用”。
这可能是为了防止它被添加到Java的更高版本中。
如果后藤不在列表中,而它后来被添加到语言中,那么使用goto作为标识符(变量名,方法名等)的现有代码将中断。但是因为后藤是一个关键字,所以这样的代码在当前甚至不会编译,并且仍然有可能在以后使它实际上做一些事情,而不破坏现有代码。
ecfdbz9o3#
如果你向上看,继续,然后中断,他们会接受一个“标签”。尝试一下。后藤本身不会工作。
Read more
nkhmeac64#
Java不支持
goto
,它被保留为关键字,以防他们想将其添加到更高版本gopyfrb35#
goto
在Java中不做任何事情。oewdyzsn6#
Java也不使用行号,这是后藤函数所必需的。与C/C++不同,Java没有后藤语句,但Java支持标签。标签在Java中唯一有用的地方是嵌套循环语句之前。我们可以用break来指定标签名称,以打破特定的外部循环。
cqoc49vn7#
在Java世界中没有“后藤”。主要原因是开发人员意识到,使用后藤的复杂代码会导致代码变得非常可怜,并且几乎不可能增强或维护代码。
然而,这段代码可以修改一点,并使用continue和break的概念,我们可以使代码工作。
ldfqzlk88#
goto
是语言中未使用的保留字。所以没有goto
。但是,如果你想要荒诞派戏剧,你可以哄骗一个标签的语言特征。但是,与其标记for循环(这有时很有用),不如标记代码块。你可以在这个代码块中,在标签上调用break,把你吐到代码块的末尾,这基本上是一个后藤,它只在代码中向前跳。这将打印1、2、3、4、5、7、8。当中断时,代码块跳到代码块的后面。您可以移动
my_goto: {
、if (true) break my_goto;
和} //goto end location.
语句。重要的是break必须在标记的代码块内。这比真实的的后藤还要丑。从来没有真正做到这一点。
但是,有时使用标签和break是有用的,而且知道如果你在break时标记代码块而不是循环,你会向前跳,这实际上是有用的。因此,如果你在循环中中断代码块,你不仅中止了循环,而且跳过了循环结束和代码块之间的代码。