web-dev-qa-db-fra.com

Existe-t-il une déclaration goto en Java?

Je suis confus à ce sujet. La plupart d'entre nous ont appris qu'il n'y avait aucune déclaration goto en Java.

Mais j’ai trouvé que c’était l’un des mots clés en Java. Où peut-il être utilisé? S'il ne peut pas être utilisé, pourquoi a-t-il été inclus dans Java en tant que mot-clé?

249
Venkat

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

C'était dans la JVM d'origine (voir réponse de @VitaliiFedorenko ), mais ensuite supprimé. Il a probablement été conservé en tant que mot clé réservé au cas où il serait ajouté à une version ultérieure de Java.

Si goto ne figurait pas dans la liste et qu'il était ajouté à la langue par la suite, le code existant qui utilisait le mot goto comme identifiant (nom de variable, nom de méthode, etc.) serait rompu. . 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 faire ultérieurement, sans casser le code existant.

191
Thomas

James Gosling a créé la machine virtuelle Java d'origine avec le support des instructions goto, mais il a ensuite supprimé cette fonctionnalité, car elle était inutile. La raison principale pour laquelle goto n'est pas nécessaire est qu'elle peut généralement être remplacée par des instructions plus lisibles (comme break/continue) ou par l'extraction d'un morceau de code dans une méthode.

Source: James Gosling, session de questions/réponses

219
Vitalii Fedorenko

Le mot clé existe, mais il n'est pas implémenté.

La seule bonne raison d'utiliser goto à laquelle je peux penser est la suivante:

for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        goto outsideloops; // to break out of both loops
    }
}
outsideloops:

Dans Java, vous pouvez faire ceci comme ceci:

loops:
for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        break loops;
    }
}
146
jonnystoten

http://Java.Sun.com/docs/books/tutorial/Java/nutsandbolts/_keywords.html

"Les mots-clés const et goto sont réservés, même s'ils ne sont pas utilisés actuellement."

43
Isaac E

Ils pourraient donc être utilisés un jour si les concepteurs de langage en ressentaient le besoin.

De plus, si les programmeurs des langages qui utilisent ces mots-clés (par exemple, C, C++) les utilisent par erreur, le compilateur Java peut donner un message d'erreur utile.

Ou peut-être était-ce juste pour empêcher les programmeurs d'utiliser goto :)

29
dave

Ils sont réservés pour une utilisation future (voir: Mots-clés du langage Java )

Les mots-clés const et goto sont réservés, même s'ils ne sont pas utilisés actuellement.

La raison pour laquelle il n'y a pas d'instruction goto dans Java se trouve dans " Le Java Environnement linguistique ":

Java n'a pas d'instruction goto. Des études ont montré que goto est (souvent) utilisé plus souvent que simplement "parce que c'est là". L'élimination de goto a conduit à une simplification du langage - il n'y a pas de règles concernant les effets d'un goto au milieu d'une déclaration pour, par exemple. Des études sur environ 100 000 lignes de code C ont montré qu'environ 90% des instructions goto étaient utilisées uniquement pour obtenir l'effet de rupture de boucles imbriquées. Comme mentionné ci-dessus, la pause multi-niveaux et continuer à supprimer la plupart des besoins pour les déclarations goto.

19
Heinzi

Voici un exemple d'utilisation des étiquettes "continue" dans Java:

public class Label {
    public static void main(String[] args) {
        int temp = 0;
        out: // label
        for (int i = 0; i < 3; ++i) {
            System.out.println("I am here");
            for (int j = 0; j < 20; ++j) {
                if(temp==0) {
                    System.out.println("j: " + j);
                    if (j == 1) {
                        temp = j;
                        continue out; // goto label "out"
                    }
                }
            }
        }
        System.out.println("temp = " + temp);
    }
}

Résultats:

I am here // i=0
j: 0
j: 1
I am here // i=1
I am here // i=2
temp = 1
16
andrew

Non, goto n'est pas utilisé, mais vous pouvez définir des étiquettes et laisser une boucle jusqu'à l'étiquette. Vous pouvez utiliser break ou continue suivi de l'étiquette. Ainsi, vous pouvez sauter plus d'un niveau de boucle. Regardez le tutoriel .

10
Arne Burmeister

Il est important de comprendre que la construction goto est un vestige des jours que les programmeurs programmaient en code machine et en langage assembleur. Parce que ces langues sont très basiques (chaque instruction ne fait que un ), le flux de contrôle du programme se fait complètement avec des instructions goto (mais en langage Assembly, elles sont appelées saut ou branche instructions).

Maintenant, bien que le langage C soit de niveau assez bas, il peut être considéré comme un langage d'assemblage de très haut niveau - chaque déclaration et fonction en C peuvent facilement être décomposées en instructions en langage d'assemblage. Bien que le langage C ne soit pas le langage principal pour programmer des ordinateurs avec, de nos jours, il est toujours fortement utilisé dans les applications de bas niveau, telles que les systèmes intégrés. Comme la fonction de C reflète si étroitement la fonction du langage d'assemblage, il est logique que goto soit inclus dans C.

Il est clair que Java est une évolution de C/C++. Java partage beaucoup de fonctionnalités de C, mais résume beaucoup plus de détails, et est donc simplement écrit différemment. Java est un langage de très haut niveau, il n'est donc simplement pas nécessaire de disposer de fonctionnalités de bas niveau comme goto lorsque plusieurs constructions de haut niveau telles que des fonctions, pour, pour chacune et pendant que faire le flux de contrôle du programme. Imaginez si vous étiez dans une fonction et faisiez goto à une étiquette dans une autre fonction. Que se passerait-il quand l'autre fonction reviendrait? Cette idée est absurde.

Cela ne répond pas nécessairement pourquoi Java inclut l'instruction goto, mais ne le laissera pas compiler, mais il est important de savoir pourquoi goto a déjà été utilisé, les applications de niveau inférieur, et pourquoi cela n’a aucun sens d’être utilisé en Java.

10
Michael P at NCSU

Non, heureusement, il n'y a pas goto en Java.

Le mot clé goto est uniquement réservé, mais n'est pas utilisé (il en va de même pour const).

9
Bozho

Parce que ce n'est pas supporté et pourquoi voudriez-vous un mot clé goto qui ne fait rien ou une variable nommée goto?

Bien que vous puissiez utiliser les instructions break label; et continue label; pour faire efficacement ce que goto fait. Mais je ne le recommanderais pas.

public static void main(String [] args) {

     boolean t = true;

     first: {
        second: {
           third: {
               System.out.println("Before the break");

               if (t) {
                  break second;
               }

               System.out.println("Not executed");
           }

           System.out.println("Not executed - end of second block");
        }

        System.out.println("End of third block");
     }
}
8
pjp

Non, goto n'est pas utilisé en Java, bien qu'il s'agisse d'un mot réservé. Il en va de même pour const. Les deux sont utilisés en C++, ce qui explique probablement pourquoi ils sont réservés; L'intention était probablement d'éviter de confondre les programmeurs C++ lors de la migration vers Java, et peut-être aussi de garder la possibilité de les utiliser dans les révisions ultérieures de Java.

7
Michael Borgwardt

Notez que vous pouvez remplacer la plupart des utilisations inoffensives de goto par

  • revenir

  • pause

  • pause étiquette

  • jeter à l'intérieur essayer-attraper-enfin

3
starblue

Comme il a été souligné, il n'y a pas de goto en Java, mais le mot clé était réservé au cas où Sun aurait l'impression d'ajouter un jour goto à Java. Ils voulaient pouvoir l'ajouter sans trop casser de code, ils ont donc réservé le mot clé. Notez qu'avec Java 5, ils ont ajouté le mot-clé enum et il n'a pas cassé autant de code.

Bien que Java n'ait pas de goto, il a des constructions qui correspondent à certaines utilisations de goto, à savoir pouvoir break et continue avec des boucles nommées . De plus, finally peut être considéré comme une sorte de tordu goto.

2
Thomas Pornin

http://docs.Oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto

Si on vous a dit qu'il n'y avait pas d'instruction goto dans Java, vous avez été dupé. En effet, Java est constitué de deux couches de code "source".

1
Mikael Lindlöf

Interdire les déclarations de variables portant le même nom.

par exemple. int i = 0, goto;

1
Karl

C'est très bien considéré comme l'une de ces choses que vous ne faites pas, mais a probablement été répertorié comme un mot réservé pour éviter toute confusion pour les développeurs.

1
Dean J

Voir le lien suivant montre tous les Java mots réservés et vous indique les versions qu'ils ont ajoutées.

http://Java.Sun.com/docs/books/tutorial/Java/nutsandbolts/_keywords.html

goto est réservé, même s'il n'est pas utilisé actuellement, ne dites jamais jamais cependant :)

1
Paul Whelan

Je ne suis pas un fan de goto non plus, car cela rend généralement le code moins lisible. Cependant, je crois qu’il existe des exceptions à cette règle (surtout en ce qui concerne les lexers et les analyseurs syntaxiques!)

Bien sûr, vous pouvez toujours importer votre programme dans Kleene Normalform en le traduisant en quelque chose d'assembleur, puis en écrivant quelque chose comme:

int line = 1;
boolean running = true;
while(running)
{
    switch(line++)
    {
        case 1: /* line 1 */
                break;
        case 2: /* line 2 */
                break;
        ...
        case 42: line = 1337; // goto 1337
                break;
        ...
        default: running = false;
                break;
    }
}

(Vous écrivez donc essentiellement un VM qui exécute votre code binaire ... où line correspond au pointeur d'instruction.)

C'est tellement plus lisible que le code qui utilise goto, n'est-ce pas?

1
Viktor Engelmann

Parce que bien que le langage Java ne l'utilise pas, le bytecode de la machine virtuelle Java le fait.

0
gribnit

Bien sûr, il s'agit d'un mot clé, mais il n'est pas utilisé au niveau du code source.

Mais si vous utilisez jasmin ou un autre langage de niveau inférieur, qui est transformé en bytecode, alors "goto" est là

0
user1722245