如何正确使用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;
的重启部分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();
}
}
正如已经指出的所有问题的答案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; //goes to the top of loopingConstructTwo and continue
break; //breaks out of loopingConstructTwo
continue outer; //goes to the outer label and reenters loopingConstructOne
break outer; //breaks out of the loopingConstructOne
continue inner; //this will behave similar to continue
}
}
我不知道我是否应该说similar
,因为我已经有了。
Java关键字列表指定了goto关键字,但它被标记为“未使用”。
这可能是为了将它添加到更高版本的Java中。
如果goto不在列表中,并且稍后将其添加到语言中,那么使用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<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;
}
}
}
}
阅读更多
链接地址: http://www.djcxy.com/p/24033.html