Comment utiliser correctement l'instruction goto


Je prends mon cours d'informatique AP au lycée.

J'ai décidé de jeter un goto énoncé dans l'un de nos laboratoires juste pour jouer, mais j'ai eu cette erreur.

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)

Je suis allé à une question goto sur Stackoverflow pour savoir comment le faire correctement, et j'ai fait exactement comme cela a été démontré dans l'une des réponses. Je ne comprends vraiment pas pourquoi le compilateur veut une instruction assert (du moins c'est ce que je suppose qu'il veut), et je n'ai aucune idée de comment utiliser assert. Il semble pour vouloir que la partie restart de goto restart; soit une variable, mais restart est juste une étiquette qui ramène le programme à la ligne 10 afin que l'utilisateur puisse entrer un int valide. S'il veut que restart soit une variable, comment faire?

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();
    }
}
Author: StackFlowed, 2014-10-17

7 answers

, Comme l'a déjà souligné toutes les réponses goto - un mot réservé dans Java et n'est pas utilisé dans la langue.

restart: est appelé un identificateur suivi de deux points.

Voici quelques choses dont vous devez prendre soin si vous souhaitez atteindre similar comportement -

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.
    }
}

Je ne sais pas si je devrais dire similar comme je l'ai déjà fait.

 59
Author: Tirath, 2018-07-02 19:03:59

La liste de mots-clés Java spécifie le mot-clé goto, mais il est marqué comme "non utilisé".

Cela a probablement été fait au cas où il devait être ajouté à une version ultérieure de Java.

Si goto n'était pas sur la liste, et qu'il était ajouté à la langue plus tard, le code existant qui utilisait le mot goto comme identifiant (nom de la variable, nom de la méthode, etc.) se casserait. Mais parce que goto est un mot-clé, un tel code ne sera même pas compilé dans le présent, et il reste possible de le faire réellement faire quelque chose plus tard, sans casser le code existant.

 11
Author: Aditya Singh, 2014-10-17 17:51:46

Si vous recherchez continue et break, ils acceptent une "étiquette". Expérimentez avec ça. Goto lui-même ne fonctionnera pas.

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;
            }
        }      
    }
}

Lire la suite

 10
Author: Bill K, 2014-11-25 07:14:03

Java ne supporte pas goto, il est réservé comme mot-clé au cas où ils voulaient l'ajouter à une version ultérieure

 3
Author: Daniel Cardoso, 2014-10-17 17:55:00

goto ne fait rien en Java.

 2
Author: Sizik, 2014-10-17 17:50:39

Java n'utilise pas non plus de numéros de ligne, ce qui est une nécessité pour une fonction GOTO. Contrairement à C / C++, Java n'a pas d'instruction goto, mais java prend en charge label. Le seul endroit où une étiquette est utile en Java est juste avant les instructions de boucle imbriquée. Nous pouvons spécifier le nom de l'étiquette avec break pour sortir une boucle externe spécifique.

 2
Author: , 2016-07-16 04:51:39

Il n'y a pas de "goto" dans le monde Java. La raison principale était que les développeurs ont réalisé que les codes complexes qui avaient goto conduiraient à rendre le code vraiment pathétique et qu'il serait presque impossible d'améliorer ou de maintenir le code.

Cependant, ce code pourrait être modifié un peu et en utilisant le concept de continuer et de casser, nous pourrions faire fonctionner le code.

    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;
}
    }
}
 0
Author: Sohail Sankanur, 2017-09-12 19:30:53