Как правильно использовать инструкцию goto
Я беру класс средней школы AP Computer Science.
Я решил бросить инструкцию 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)
Я отправился на вопрос 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();
}
}
Ответы
Ответ 1
Как уже указывалось всеми ответами 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
, как я уже есть.
Ответ 2
список ключевых слов Java указывает ключевое слово goto, но оно помечено как "не используется".
Это, вероятно, было сделано, если оно должно быть добавлено к более поздней версии Java.
Если goto не был в списке, и он был добавлен позже на язык, существующий код, который использовал слово goto как идентификатор (имя переменной, имя метода и т.д.), сломался. Но поскольку goto является ключевым словом, такой код даже не будет компилироваться в настоящее время, и остается возможным сделать это на самом деле делать что-то позже, не нарушая существующий код.
Ответ 3
Если вы посмотрите вверх и перерыв, они принимают "Ярлык". Поэкспериментируйте с этим. Перейти сам не будет работать.
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;
}
}
}
}
Подробнее
Ответ 4
Java не поддерживает goto
, он зарезервирован как ключевое слово, если он хочет добавить его в более позднюю версию
Ответ 5
goto
ничего не делает в Java.
Ответ 6
Java также не использует номера строк, что является необходимостью для функции GOTO. В отличие от C/С++, Java не имеет инструкции goto, но java поддерживает ярлык. Единственное место, где метка полезна в Java, находится прямо перед вложенными операторами цикла. Мы можем указать имя ярлыка с разрывом, чтобы разбить определенный внешний цикл.
Ответ 7
В мире Java нет "goto". Основная причина заключалась в том, что разработчики поняли, что сложные коды, которые были goto, приведут к тому, что код будет очень жалким, и почти невозможно будет улучшить или поддерживать код.
Однако этот код можно немного изменить, и с использованием концепции продолжения и разрыва мы могли бы заставить код работать.
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;
}
}
}