web-dev-qa-db-fra.com

En Java, comment break interagit-il avec les boucles imbriquées?

Je sais qu'une instruction break saute d'une boucle, mais saute-t-elle d'une boucle imbriquée ou de celle dans laquelle elle est actuellement?

37
Craig

Sans ornement, break ne fera que sortir de la boucle la plus intérieure. Ainsi dans ce code:

while (true) { // A
    while (true) { // B
         break;
    }
}

la break ne ferme que la boucle B, de sorte que le code sera bouclé pour toujours.

Cependant, Java possède une fonctionnalité appelée "pauses nommées" dans laquelle vous pouvez nommer vos boucles, puis spécifier celle à partir de laquelle vous souhaitez vous échapper. Par exemple:

A: while (true) {
    B: while (true) {
         break A;
    }
}

Ce code ne bouclera pas indéfiniment, car la break laisse explicitement la boucle A.

Heureusement, cette même logique fonctionne pour continue. Par défaut, continue exécute la prochaine itération de la boucle la plus interne contenant l’instruction continue, mais elle peut également être utilisée pour passer aux itérations de la boucle externe en spécifiant le libellé d’une boucle pour continuer à exécuter.

Dans les langages autres que Java, par exemple C et C++, cette instruction "label break" n'existe pas et il n'est pas facile de sortir d'une boucle multipliée imbriquée. Cela peut être fait en utilisant l'instruction goto, bien que cela soit généralement mal vu. Par exemple, voici à quoi pourrait ressembler une rupture imbriquée en C, en supposant que vous êtes prêt à ignorer le conseil de Dijkstra et à utiliser goto:

while (true) {
    while (true) {
        goto done;
    }
}
done:
   // Rest of the code here.

J'espère que cela t'aides!

80
templatetypedef

Par défaut, il sort de la boucle la plus interne. Mais vous pouvez spécifier des étiquettes et faire sauter les boucles externes aussi.

4
biziclop

Vous pouvez également vous échapper en utilisant des exceptions, afin de pouvoir gérer plusieurs raisons.

 void fkt1() {
    try {
        while (true)
            fkt2();
    } catch (YourAbortException e) {
        e.printStackTrace();
    }

    //go on
}

void fkt2() {
    while (true)
        if (abort)
            throw new YourAbortException();
}
0
Marian Klühspies