Oui, MadMurf souligne la différence la plus importante: l'accessibilité à vérifier au moment de la compilation. La norme de l'idiome serait attraper quelque chose comme cela, et avec raison, de l'empêcher de la compilation:
try {
} catch (IndexOutOfBoundsException iooe) {
} catch (ArrayIndexOutOfBoundsException aiooe) {
}
Le si/instanceof analogique proposé dans la question d'origine serait la compilation (ce qui n'est PAS ce que vous voulez parce que c'est erroné).
La raison pour laquelle la norme de l'idiome des captures de l'erreur au moment de la compilation est donné dans JLS 14.21 Inaccessible États.
- Un bloc catch C est accessible ssi les deux conditions suivantes sont remplies:
- [...]
- Il n'y a pas plus tôt bloc catch Un dans l'instruction try telles que le type de C paramètre est le même que ou une sous-classe du type d'Un paramètre.
Pour illustrer ce point, le suivant compile:
try {
} catch (Exception e) {
if (e instanceof Exception) {
} else if (e instanceof Exception) {
}
}
Comme vous pouvez le voir, cette "pokemon attraper" l'idiome est beaucoup plus difficile à maintenir, car il contourne certains moment de la compilation d'accessibilité vérifier appliquées dans la norme de l'idiome.
Pour faire le point encore plus clair, si vous l'avez fait exprès ou pas, vous avez réellement réorganisé l'ordre dans lequel vous avez coché les exceptions dans votre question initiale, un fait qui aurait facilement pu être oubliée par les autres. Si SubSubException est une sous-classe de SubException, la deuxième si la condition ne sera JAMAIS évalué, et que son corps est effectivement inaccessible code.
Le si/instanceof approche est TRÈS sujettes à des erreurs.