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();
}
}
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.
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.
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;
}
}
}
}
Java ne supporte pas goto
, il est réservé comme mot-clé au cas où ils voulaient l'ajouter à une version ultérieure
goto
ne fait rien en Java.
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.
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;
}
}
}