«Loop:» dans le code Java. Qu'est-ce que c'est et pourquoi compile-t-il?


113

Ce code m'a juste fait regarder mon écran pendant quelques minutes:

loop:
for (;;) {
    // ...
}

( ligne 137 ici )

Je n'avais jamais vu cela auparavant, et je n'avais aucune idée que Java avait un mot-clé "boucle" (NetBeans ne le colore même pas comme un mot-clé), et il se compile bien avec JDK 6.

Quelle est l'explication?

Réponses:


205

Ce n'est pas un keywordc'est un label.

Usage:

    label1:
    for (; ; ) {
        label2:
        for (; ; ) {
            if (condition1) {
                // break outer loop
                break label1;
            }
            if (condition2) {
                // break inner loop
                break label2;
            }
            if (condition3) {
                // break inner loop
                break;
            }
        }
    }

Documentation .


19
Il convient de mentionner, comme l'OP n'est peut-être pas familier avec le concept goto / label, qu'il est généralement considéré comme une mauvaise pratique, sauf dans des situations très particulières (par exemple, pour raccourcir plusieurs boucles imbriquées).
haylem le

10
@haylem est vrai, mais j'irais plus loin: plusieurs boucles imbriquées sont généralement une mauvaise pratique également. Chaque fois que j'utilisais des étiquettes de boucle, je refaisais finalement le code pour ne pas en avoir besoin. Il y a toujours un meilleur moyen que cela.
Sean Patrick Floyd

73

Comme l'ont dit d'autres affiches, c'est une étiquette, pas un mot-clé. L'utilisation d'étiquettes vous permet de faire des choses comme:

outer: for(;;) {
   inner: for(;;) {
     break outer;
   }
}

Cela permet de rompre la boucle extérieure.

Lien vers la documentation .


31

La question est répondue, mais en remarque:

J'ai entendu parler de questions d'entrevue à la "Pourquoi ce code Java est-il valide?" (dépouillé l'exemple le plus simple; voici le plus méchant, merci Tim Büthe):

url: http://www.myserver.com/myfile.mp3
downLoad(url);

Sauriez-vous tous ce qu'est ce code (à part horrible)?

Solution: deux étiquettes, urlet http, un commentaire www.myserver.com/myfile.mp3et un appel de méthode avec un paramètre qui porte le même nom ( url) que l'étiquette. Oui, cela compile (si vous définissez l'appel de méthode et la variable locale ailleurs).


FYI vous n'avez pas besoin de la boucle, a; dans la ligne suivante suffit
Tim Büthe

Merci de me le rappeler, je pense qu'il n'y avait pas de boucle dans la question. Je vais modifier ma réponse (on ne m'a jamais posé cette question mais l'intervieweur était un ancien de mes collègues)
Sean Patrick Floyd

16

Ce n'est pas un mot-clé, c'est une étiquette. Il est destiné à être utilisé avec les mots break- continueclés et à l' intérieur de boucles imbriquées:

outer:
for(;;){
    inner:
    for(;;){
        if(){
            break inner; // ends inner loop
        } else {
            break outer; // ends outer loop
        }
    }
}

innerl'étiquette est inutile ici, break;c'est assez
gertas

12
S'il y a deux façons de briser la boucle, j'apprécie l' innerétiquette pour sa clarté.
Steve Jackson du

1
@gertas: Je pense qu'il ne fait que démontrer le point. Mais selon Steve Jackson, ce serait peut-être une bonne idée de le dire de toute façon à des fins d'auto-documentation.
Jay le

5

Ce n'est pas un mot-clé; c'est une étiquette .

Il vous permet d'aller un étiqueté breaket étiqueté continue.


4

C'est vraiment une réponse au commentaire de seanizer sur la réponse de org.life.java, mais je voulais mettre du code pour que je ne puisse pas utiliser la fonction de commentaire.

Bien qu'il soit très rare que je trouve une utilisation pour "break label", cela arrive parfois. Le cas le plus courant est lorsque je recherche quelque chose qui se trouve dans une structure nécessitant une boucle imbriquée pour la recherche, comme:

search:
for (State state : stateList)
{
  for (City city : state.cityList)
  {
    if (city.zipcode.equals(wantZip))
    {
      doSomethingTo(city);
      break search;
    }
  }
}

Habituellement, dans de tels cas, je pousse le tout dans un sous-programme afin que, sur un coup, je puisse renvoyer l'objet trouvé, et s'il tombe au bas de la boucle, je peux retourner null pour indiquer un non trouvé, ou peut-être lancer une exception. Mais cela est parfois utile.

Franchement, je pense que les inventeurs de Java ont inclus cette fonctionnalité car entre cela et la gestion des exceptions, ils ont éliminé les deux dernières utilisations légitimes de GOTO.

Addendum très tardif:

J'ai vu une bonne ligne de code bâillon une fois. Le programmeur a écrit:

http://www.example.com/xyz.jsp
for (Foo foo1 : foolist)

Il n'a pas vraiment dit «exemple.com» mais le site Web de notre entreprise.

Cela donne l'impression qu'il y a une URL dans le code. Il se compile avec succès, comme s'il faisait quelque chose. Mais ... qu'est-ce que ça fait?

En réalité, cela ne fait rien. "http:" est un label auquel il ne fait jamais référence. Ensuite, le "//" fait du reste de la ligne un commentaire.


4

C'est une étiquette de point de rupture, pour vous permettre de sortir d'une boucle spécifiée, plutôt que simplement celle la plus interne dans laquelle vous vous trouvez.

Il est utilisé à la ligne 148 .


2

Vous pourriez écrire presque n'importe quoi, car c'est une étiquette ... Vous avez un exemple ici


2

C'est une étiquette, mais regardez l'exemple suivant:

int a = 0;
int b = 0
while (a<10){
    firstLoop:
    a++;
    while(true){
        b++
        if(b>10){
            break firstLoop;
        }
    }
 }

Lorsque b>10le flux d'exécution va à la boucle externe.


1

C'est une étiquette, et les étiquettes en Java peuvent être utilisées avec le breakcontinue mots clés et pour un contrôle supplémentaire sur les boucles.

Ici, il est expliqué d'une manière plutôt bonne:

Penser en Java, rompre et continuer


1

Ce n'est pas un mot-clé, mais une étiquette . Si forvous écrivez dans la boucle break loop;, vous quittez cette boucle.


0

C'est une étiquette. Généralement, une étiquette utilisée en Java pour transférer le flux de contrôle à l'emplacement souhaité, tandis que tous les mots-clés, comme continuer et interrompre, ont un choix d'emplacement spécifié.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.