Jusqu’à maintenant, dans la structure try-catch, chaque catch ne pouvait traiter qu’un seul type d’exception. Donc c’est un traitement spécifique pour chaque type d’exception attrapée.
try {
Class.forName("org.sewatech.examples.java7.MyClass").newInstance();
//...
} catch (ClassNotFoundException e) {
System.err.printf("Problème de création de mon objet (%s)\n", e);
} catch (InstantiationException e) {
System.err.printf("Problème de création de mon objet (%s)\n", e);
} catch (IllegalAccessException e) {
System.err.printf("Problème de création de mon objet (%s)\n", e);
}
On peut certes jouer avec l’héritage entre classes d’exception, mais on arrive rapidement à quelque chose comme catch(Exception ex). Sans grand intérêt.
try {
Class.forName("org.sewatech.examples.java7.MyClass").newInstance();
//...
} catch (Exception e) {
System.err.printf("Problème de création de mon objet (%s)\n", e);
}
Pour éviter ce tout-ou-rien, Java SE 7 permet maintenant de traiter plusieurs types d’exceptions, séparés par un 'pipe', pour chaque catch.
try {
Class.forName("org.sewatech.examples.java7.MyClass").newInstance();
//...
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
System.err.printf("Problème de création de mon objet (%s)\n", e);
}
Au passage, le rethrow est mieux géré, avec une meilleure inférence.
Très pratique, cette nouveauté ne devrait pas être tant utilisée que cela ; la faute aux frameworks comme hibernate, JPA, Spring, CDI,… qui nous aident à mieux gérer les exceptions et, surtout, à en séparer le traitement du code métier.