web-dev-qa-db-fra.com

"boucle:" dans Java. Qu'est-ce que c'est, et pourquoi est-il compilé?

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

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

( ligne 137 ici )

Je n'ai jamais vu cela auparavant, et je n'avais aucune idée Java a un mot-clé "loop" (NetBeans ne le colore même pas comme un mot-clé), et il compile très bien avec JDK 6.

Quelle est l'explication?

106
Amy B

Ce n'est pas un keyword c'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 .

198
Jigar Joshi

Comme d'autres affiches l'ont dit, 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 .

73
Rob Di Marco

On répond à la question, mais en note:

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

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

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

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

31
Sean Patrick Floyd

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

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

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

Il vous permet d'aller dans un break et un continue étiquetés.

5
codaddict

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

Il est utilisé sur ligne 148 .

4
PaulJWilliams

C'est vraiment une réponse au commentaire de seanizer sur la réponse de org.life.Java, mais je voulais mettre du code afin 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 occasionnellement. Le cas le plus courant est lorsque je recherche quelque chose qui est dans une structure nécessitant une boucle imbriquée pour rechercher, 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 retourner l'objet trouvé, et s'il tombe en bas de la boucle, je peux retourner null pour indiquer un non trouvé, ou peut-être lever 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 grande ligne de code gag une fois. Le programmeur a écrit:

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

Il n'a pas dit "example.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 fait quelque chose. Mais ... qu'est-ce que ça fait?

En réalité, cela ne fait rien. "http:" est une étiquette à laquelle il ne fait jamais référence. Ensuite, le "//" fait le reste de la ligne un commentaire.

4
Jay

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

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

2
Alberto Zaccagni

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

2
SoulWanderer

Il s'agit d'une étiquette et les étiquettes en Java peuvent être utilisées avec les mots clés break et continue pour un contrôle supplémentaire sur les boucles.

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

Penser en Java, casser et continuer

1
vstoyanov

Ce n'est pas un mot-clé, mais un label. Si à l'intérieur de la boucle for vous écrivez break loop;, et vous quittez cette boucle.

1
greuze

C'est une étiquette. Généralement, une étiquette utilisée dans 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 spécifié d'emplacement.

0
RTA