70 votes

Attraper plusieurs exceptions dans Java-8

En essayant la fonctionnalité multi-capture que j'ai trouvée dans ma méthode m1() , tout fonctionne bien comme prévu.

Cependant, dans m2() le même code ne se compile pas. Je viens de changer la syntaxe pour réduire le nombre de lignes de code.

 public class Main {

    public int m1(boolean bool) {
        try {
            if (bool) {
                throw new Excep1();
            }
            throw new Excep2();
            //This m1() is compiling  abs fine.
        } catch (Excep1 | Excep2 e) {
            return 0;
        }
    }

    public int m2(boolean b) {
        try {
            throw b ? new Excep1() : new Excep2();
            //This one is not compiling.
        } catch (Excep1 | Excep2 e) {
            return 0;
        }
    }

    private static interface I {
    }

    private static class Excep1 extends Exception implements I {
    }

    private static class Excep2 extends Exception implements I {
    }
}

Pourquoi la méthode m2() compile-t-elle pas?

23voto

GideonleGrange Points 346

Vous confondez le compilateur avec cette ligne:

 throw b ? new Excep1() : new Excep2();

Le compilateur voit que le résultat de l'expression (à droite du jet) est la super-classe commune entre Except1 et Except2, qui est Exception, et par conséquent le type effectif que vous lancez devient Exception. L'instruction catch ne peut pas détecter que vous essayez de lancer Excep1 ou Except2.

4voto

user7294900 Points 16410

Java vous restreint pour attraper ou déclarer tous les types d'exceptions que la méthode peut lever,

Il recherche le parent commun pour les deux (/ toutes) exceptions et s'attend à ce que vous attrapiez ou déclariez comme lancers, par exemple si Excep1 étend Throwable vous devrez également attraper Throwable

Dans le premier cas, Java est sûr que vous lancez Excep1 ou Excep2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X