Cheminement des Exceptions et Choix du Gestionnaire

Quels résultats fournit ce programme ?

class Erreur extends Exception {
    public int num;
}

class Erreur_d extends Erreur {
    public int code;
}

class A {
    public A(int n) throws Erreur_d {
        if (n == 1) { 
            Erreur_d e = new Erreur_d();
            e.num = 999;
            e.code = 12;
            throw e;
        }
    }
}

public class Chemin1 {
    public static void main(String[] args) {
        try {
            A a = new A(1);
            System.out.println("apres creation a(1)");
        } catch (Erreur e) {
            System.out.println("** exception Erreur " + e.num);
        }
        System.out.println("suite main");
        
        try {
            A b = new A(1);
            System.out.println("apres creation b(1)");
        } catch (Erreur_d e) {
            System.out.println("** exception Erreur_d " + e.num + " " + e.code);
        } catch (Erreur e) {
            System.out.println("** exception Erreur " + e.num);
        }
    }
}

 

Correction

Dans le premier bloc try, l’appel du constructeur de A déclenche une exception de type Erreur_d. Celle-ci est traitée par l’unique gestionnaire relatif au type Erreur, ce qui est acceptable puisque Erreur_d dérive de Erreur.

Dans le second bloc try, la même exception est déclenchée, mais cette fois deux gestionnaires lui sont associés. Le premier gestionnaire trouvé qui convient est celui qui est exécuté, soit celui pour Erreur_d. En définitive, les résultats obtenus sont :

** exception Erreur 999
suite main
** exception Erreur_d 999 12

Notez que les messages apres creation a(1) et apres creation b(1) ne sont pas affichés puisque les deux blocs try sont interrompus avant d'arriver à ces instructions.

Que se passe-t-il si l’on inverse l’ordre des deux gestionnaires dans le second bloc try ?

Si l’on inverse l’ordre des deux gestionnaires dans le second bloc try, c'est-à-dire si le gestionnaire pour Erreur est placé avant celui pour Erreur_d, on obtient une erreur de compilation. En effet, le gestionnaire pour Erreur capturerait toutes les exceptions de type Erreur, y compris celles de type Erreur_d, rendant ainsi le second gestionnaire redondant et inatteignable. Par conséquent, le compilateur signale que le second gestionnaire ne peut jamais être atteint.

Si vous avez trouvé les exercices corrigés en Java de Mr JoëlYk intéressants et utiles, pourquoi ne pas les partager avec d'autres personnes qui pourraient également en bénéficier ? Partagez ce lien sur les réseaux sociaux ou envoyez-le à vos amis et collègues. Vous pourriez aider quelqu'un à améliorer ses compétences en programmation ou à trouver des solutions à des problèmes complexes. N'oubliez pas que la connaissance doit être partagée pour grandir. Merci pour votre soutien et votre partage !

Contact WhatsApp : +237 652027193 | Réaliser Par Joël_Yk

Bouton Vert Citron Scintillant PLUS D'EXERCICES
Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam