Perdu dans les boucles imbriquées ? Vous n'êtes pas seul !
\n\nImaginez la situation : vous écrivez une recherche dans un tableau à deux dimensions, vous traitez une matrice ou vous cherchez des doublons dans une liste de listes. Et soudain, vous réalisez qu'il ne faut pas seulement interrompre la boucle interne, mais sortir des deux à la fois. Une douleur familière ? Si vous avez déjà googlé "how do I break out of nested loops in Java" — vous n'êtes pas seul. Cette question a recueilli des centaines de milliers de vues sur Stack Overflow, et ce n'est pas pour rien : Java n'a pas de solution simple à un seul mot-clé pour cette tâche.
\n\nDans cet article, nous allons analyser 4 méthodes fiables pour sortir des boucles imbriquées en Java. Vous apprendrez pourquoi le simple break ne fonctionne pas, comment utiliser les étiquettes (labels) sans nuire à la lisibilité, et quand il vaut mieux abandonner les boucles au profit de solutions plus élégantes. C'est parti !
Pourquoi un simple break ne résout-il pas le problème ?
\n\nAllons droit au but. Voici un code typique que les débutants écrivent :
\n\nint[][] matrix = {\n {1, 2, 3},\n {4, 5, 6},\n {7, 8, 9}\n};\n\nint target = 5;\nboolean found = false;\n\nfor (int i = 0; i < matrix.length; i++) {\n for (int j = 0; j < matrix[i].length; j++) {\n if (matrix[i][j] == target) {\n found = true;\n break; // Sort UNIQUEMENT de la boucle interne !\n }\n }\n // La boucle externe continue !\n}\n\nLe problème est évident : le mot-clé break en Java n'interrompt que la boucle dans laquelle il se trouve. La boucle externe continue de s'exécuter, et vous perdez le contrôle de la logique. C'est l'une des erreurs les plus fréquentes discutées dans les réponses à la question "how to break nested loops in Java".
Méthode n°1 : Utilisation des étiquettes (labeled break)
\n\nLa méthode la plus directe et native — les étiquettes (labels). Oui, Java a un mécanisme similaire à goto, mais il est strictement limité au travail avec les boucles. Voici à quoi cela ressemble :
int[][] matrix = {\n {1, 2, 3},\n {4, 5, 6},\n {7, 8, 9}\n};\n\nint target = 5;\nboolean found = false;\n\nouterLoop: // ← Étiquette pour la boucle externe\nfor (int i = 0; i < matrix.length; i++) {\n for (int j = 0; j < matrix[i].length; j++) {\n if (matrix[i][j] == target) {\n found = true;\n break outerLoop; // ← Sort DE la boucle externe !\n }\n }\n}\n\nSystem.out.println("Trouvé : " + found); // true\n\nComment cela fonctionne :
\n- \n
- Nous plaçons une étiquette
outerLoop:devant la boucle externe (le nom est libre, mais par convention — camelCase ou snake_case). \n - Lorsque
break outerLoop;est exécuté, le contrôle passe à la ligne juste après la boucle externe. \n
Inconvénient : certains développeurs considèrent les étiquettes comme une "astuce sale" qui nuit à la lisibilité. Mais en pratique, pour des boucles imbriquées simples, c'est une approche tout à fait normale. C'est la réponse la plus populaire sur Stack Overflow pour la question "how do I break out of nested loops in Java".
\n\nMéthode n°2 : Variable drapeau (boolean guard)
\n\nSi les étiquettes vous semblent trop exotiques, utilisez un drapeau classique. L'idée est simple : on crée une variable booléenne qui signale la nécessité de sortir.
\n\nint[][] matrix = {\n {1, 2, 3},\n {4, 5, 6},\n {7, 8, 9}\n};\n\nint target = 5;\nboolean found = false;\n\nfor (int i = 0; i < matrix.length && !found; i++) { // ← vérification du drapeau dans la condition\n for (int j = 0; j < matrix[i].length; j++) {\n if (matrix[i][j] == target) {\n found = true;\n break; // sort de la boucle interne\n }\n }\n // La boucle externe se termine aussi, car found == true\n}\n\nSystem.out.println("Trouvé : " + found);\n\nAvantages : le code est compréhensible même pour un débutant, ne nécessite pas la connaissance des étiquettes.
\nInconvénients : la boucle externe effectue toujours une itération supplémentaire (vérification de la condition