Branching en Java

Dans ce guide complet sur le branching en Java, nous abordons les différentes structures de contrôle de flux qui permettent de modifier le chemin d’exécution d’un programme. Ce document pédagogique, optimisé pour le SEO et intégrant le terme branching en Java ainsi que ses synonymes, vous explique comment utiliser efficacement les boucles imbriquées, les instructions break, continue et return dans vos programmes.

Contrôle de Flux avec Branching en Java

Jusqu’à présent, nous avons travaillé avec des boucles simples qui se terminent dès que leur expression booléenne est fausse. Ici, nous vous présentons d’autres façons pour qu’une boucle se termine ou bifurque. En outre, vous découvrirez que le chemin d’exécution à l’exécution peut être bien plus complexe que dans les exemples précédents.

Boucles Imbriquées et Branching

Une boucle imbriquée est une boucle qui contient une autre boucle (while, do/while, for ou for-each). Par exemple, considérez le code suivant qui itère sur un tableau à deux dimensions, c’est-à-dire un tableau contenant d’autres tableaux.

// Déclaration d'un tableau à deux dimensions
int[][] monTableauComplexe = {{5,2,1,3}, {3,9,8,9}, {5,7,12,7}};

for (int[] monTableauSimple : monTableauComplexe) {
    for (int i = 0; i < monTableauSimple.length; i++) {
        System.out.print(monTableauSimple[i] + "\t");
    }
    System.out.println();
}

De plus, considérez cet exemple qui utilise une boucle while avec une boucle do/while imbriquée :

int hippopotameAffame = 8;
while (hippopotameAffame > 0) {
    do {
        hippopotameAffame -= 2;
    } while (hippopotameAffame > 5);
    hippopotameAffame--;
    System.out.print(hippopotameAffame + ", ");
}

Utilisation d’Étiquettes Optionnelles

Les étiquettes optionnelles permettent d’indiquer un point précis dans le code vers lequel le flux d’exécution peut être redirigé. Par exemple, dans le code suivant, nous avons ajouté des étiquettes pour identifier les boucles externes et internes.

int[][] monTableauComplexe = {{5,2,1,3}, {3,9,8,9}, {5,7,12,7}};

BOUCLE_EXTERIEURE: for (int[] monTableauSimple : monTableauComplexe) {
    BOUCLE_INTERIEURE: for (int i = 0; i < monTableauSimple.length; i++) {
        System.out.print(monTableauSimple[i] + "\t");
    }
    System.out.println();
}

Par ailleurs, voici un exemple qui montre comment ajouter des étiquettes à une instruction if :

int grenouille = 15;

MAUVAIS_IDEE: if (grenouille > 10)
    ENCORE_MAUVAIS_IDEE: {
        grenouille++;
    }

Instruction break et Contrôle de Boucle

L’instruction break permet de sortir prématurément d’une boucle. Dans l’exemple suivant, nous recherchons la première occurrence d’une valeur dans un tableau à deux dimensions.

public class TrouverDansMatrice {
    public static void main(String[] args) {
        int[][] liste = {{1,13}, {5,2}, {2,2}};
        int valeurRecherchee = 2;
        int positionX = -1;
        int positionY = -1;

        BOUCLE_PARENT: for (int i = 0; i < liste.length; i++) {
            for (int j = 0; j < liste[i].length; j++) {
                if (liste[i][j] == valeurRecherchee) {
                    positionX = i;
                    positionY = j;
                    break BOUCLE_PARENT;
                }
            }
        }
        if (positionX == -1 || positionY == -1) {
            System.out.println("Valeur " + valeurRecherchee + " non trouvée");
        } else {
            System.out.println("Valeur " + valeurRecherchee + " trouvée à: (" + positionX + "," + positionY + ")");
        }
    }
}

Notez que si l’instruction break est utilisée sans étiquette, seule la boucle interne se termine. Si le break est complètement omis, la boucle parcourt l’intégralité de la structure, recherchant ainsi la dernière occurrence de la valeur.

Instruction continue pour Passer à l’Itération Suivante

L’instruction continue termine l’itération courante de la boucle et passe directement à la vérification de la condition. Voici un exemple illustrant comment un gardien de zoo doit nettoyer le premier léopard de chaque étable tout en sautant l’étable « b ».

public class PlanningDeNettoyage {
    public static void main(String[] args) {
        NETTOYAGE: for (char etables = 'a'; etables <= 'd'; etables++) {
            for (int leopard = 1; leopard < 4; leopard++) {
                if (etables == 'b' || leopard == 2) {
                    continue NETTOYAGE;
                }
                System.out.println("Nettoyage : " + etables + "," + leopard);
            }
        }
    }
}

En outre, si l’étiquette est omise dans l’instruction continue, le contrôle revient à la boucle interne, ce qui entraîne un comportement différent dans l’affichage des résultats.

Utilisation de l’Instruction return pour Simplifier le Contrôle

L’instruction return permet de quitter une méthode et, dans certains cas, de simplifier la gestion des boucles imbriquées. Le code suivant réécrit la classe précédente en utilisant return pour interrompre la recherche dès que la valeur est trouvée.

public class TrouverDansMatriceAvecRetour {
    private static int[] rechercherValeur(int[][] liste, int valeur) {
        for (int i = 0; i < liste.length; i++) {
            for (int j = 0; j < liste[i].length; j++) {
                if (liste[i][j] == valeur) {
                    return new int[] { i, j };
                }
            }
        }
        return null;
    }

    public static void main(String[] args) {
        int[][] liste = { { 1, 13 }, { 5, 2 }, { 2, 2 } };
        int valeurRecherchee = 2;
        int[] resultats = rechercherValeur(liste, valeurRecherchee);

        if (resultats == null) {
            System.out.println("Valeur " + valeurRecherchee + " non trouvée");
        } else {
            System.out.println("Valeur " + valeurRecherchee + " trouvée à: (" + resultats[0] + "," + resultats[1] + ")");
        }
    }
}

Code Illustratif : Détection de Code Inaccessible

Il est important de noter que toute instruction placée immédiatement après un break, continue ou return dans le même bloc est considérée comme inatteignable et ne compilera pas.

// Exemple de code inatteignable
int controleDate = 0;
while (controleDate < 10) {
    controleDate++;
    if (controleDate > 100) {
        break;
        controleDate++; // NE COMPILE PAS
    }
}
int minute = 1;
SURVEILLANCE: while (minute > 2) {
    if (minute++ > 2) {
        continue SURVEILLANCE;
        System.out.print(minute); // NE COMPILE PAS
    }
}
int heure = 2;
switch (heure) {
    case 1:
        return;
        heure++; // NE COMPILE PAS
    case 2:
}

Tableau Récapitulatif des Instructions de Contrôle

Le tableau ci-dessous résume l’utilisation des étiquettes, break, continue et yield dans différentes structures de contrôle en Java.

StructureSupporte les étiquettesSupporte breakSupporte continueSupporte yield
whileOuiOuiOuiNon
do/whileOuiOuiOuiNon
forOuiOuiOuiNon
switchOuiOuiNonOui

En conclusion, la compréhension et la maîtrise du branching en Java vous permettront d’écrire des programmes plus flexibles et efficaces. De plus, l’utilisation judicieuse de boucles imbriquées et d’instructions de contrôle améliore la lisibilité et la maintenabilité de votre code.

Transitionnellement, n’hésitez pas à expérimenter ces concepts dans vos projets personnels pour renforcer votre compréhension du contrôle de flux en Java.