Как правильно использовать инструкцию 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;
}
    }
}