Pour autant que je sache, il n’existe aucun moyen de savoir quelles exceptions une méthode génère sans consulter les documents de l’API un par un.
Comme ce n'est pas une option, j'aimerais inverser la recherche et vous demander quelles sont les exceptions les plus courantes et les exceptions RuntimeExceptions que vous avez rencontrées lorsque vous traitez avec:
Je me rends compte que cela peut être subjectif et ennuyeux, mais c’est pour un test de classe et je ne sais vraiment pas mieux.
Supposons que les éléments ci-dessous correspondent à Java.lang
, sauf indication contraire de ma part:
Vous feriez bien de consulter les pages de résumé des packages du site Java. En voici un: http://Java.Sun.com/j2se/1.4.2/docs/api/Java/io/package-summary.html
Liste des exceptions non vérifiées
ArrayIndexOutOfBoundsException
ClassCastException
Exception d'argument illégal
IllegalStateException
NullPointerException
NumberFormatException
AssertionError
ExceptionInInitializerError
StackOverflowError
NoClassDefFoundError
Liste des exceptions vérifiées
Exception
IOException
FileNotFoundException
ParseException
ClassNotFoundException
CloneNotSupportedException
InstantiationException
InterruptedException
NoSuchMethodException
NoSuchFieldException
NullPointerException
Java.lang:
Java.util:
Java.io:
Comme le dit le projet de loi K. Les exceptions vérifiées sont faciles. Si votre éditeur de programme/IDE ne vous donne pas un moyen rapide de voir les méthodes javadocs ou les signatures, vous devez le jeter. Sérieusement.
Les exceptions non contrôlées sont un autre type de poisson. Mais je pense que la meilleure stratégie avec des exceptions non contrôlées est de ne pas essayer de les attraper. Au lieu de cela, vous écrivez votre code pour qu’il évite de le lancer en premier lieu. Par exemple;
// ... not sure if 'obj' is null
if (obj != null) {
obj.someMethod();
}
// ... not sure if 'obj' has the right type
if (obj instanceof Foo) {
Foo foo = (Foo) obj;
}
// ... not sure if 'i' is in range
if (i >= 0 && i < array.length) {
.... = array[i];
}
Voici pourquoi je recommande ceci:
// obj pourrait être null ... essayez { obj.doquelquechose (); } catch (NullPointerException ex) { System.err.println ("obj était null"); // FAUX!!! // le NPE aurait pu se produire dans doSomething () }
Évidemment, vous n'incluez que ces vérifications de "garde" où votre compréhension du code vous indique qu'elles sont nécessaires! Ainsi, par exemple, si vous savez que "obj" doit être non nul et que "i" doit être à portée, il est judicieux de laisser les chèques. Si vous omettez un test de trop, vous obtiendrez une exception ... mais c'est bien, vous pouvez ensuite utiliser le stacktrace pour comprendre pourquoi votre compréhension du code était erronée et peut-être corriger le bogue sous-jacent.
J'aimerais contribuer à une liste qui regroupe par situation, ce qui est probablement plus significatif que de regrouper des packages ou des domaines de programmation.
Ce sont des exceptions qui, idéalement, ne devraient jamais être intégrées à la production. Vous devriez les réparer au lieu de les attraper et stfu.
Ils ne devraient jamais se reproduire une fois que vous les voyez.
@NotNull
s?Map.get()
?List.get()
?array[array.length] = newElement
Et moins susceptible de voir,
synchronized
est nul, mais c'est comme ça dans la plupart des languesEt puis vous obtenez plus de NullPointerException.
Et ensuite ... Toujours NullPointerException? Cette annotation @NotNull
est une foutaise!
Les exceptions qui se produisent en raison de conditions de course ou de probabilité rare. Vous devriez acheter une loterie si vous les voyez les 10 premières fois que vous exécutez votre code.
synchronized
est oùIls se produisent généralement lorsque vous avez gâché les dépendances, utilisé de mauvaises versions de bibliothèques, etc.
et quand vous utilisez @lombok.SneakyThrows
ou équivalent
S'ils ne sont pas attrapés, cela signifie probablement que vous êtes également trop paresseux. Vous ne pouvez pas les empêcher de lancer; il suffit de les attraper.
Il est fort probable que ces exceptions se produisent et doivent toujours être traitées de manière spécifique (c’est-à-dire que vous devriez les gérer au lieu de simplement afficher l’erreur).
Ces exceptions sont parfois dues à une entrée utilisateur non valide (mais vous devez les valider, je les classe donc comme des "exceptions inattendues") et parfois à cause de contraintes système qui pourraient ne pas être reproductibles lors de tests (sans contrainte).
Les exceptions cochées sont faciles, votre éditeur doit afficher les javadocs lorsque vous survolez/complétez le nom de la méthode.
Les erreurs non vérifiées sont généralement des erreurs réelles et ne sont même pas le plus souvent dans les javadocs. Je suppose que la plus courante pourrait être IllegalArgumentException, toute méthode ayant une combinaison de paramètres non valide qui devrait être renvoyée.
Que diriez-vous de chercher des sous-classes de Java.lang.exception, par exemple ici
Personnellement, j'utilise 2 exceptions vérifiées de ma propre TransientException dans les cas où une nouvelle tentative pourrait fonctionner. Et InvalidRequestException pour les erreurs de validation.
NumberFormatException
Casting - ClassCastException
Tableaux - ArrayIndexOutOfBoundsException
Vector, ArrayList, HashMap, etc. - Je vois rarement des exceptions lorsque je travaille avec des collections Java, mais très occasionnellement, ConcurrentModificationException
IO (classe de fichier, flux, filtres,…) - FileNotFoundException
Sérialisation d'objet - ClassNotFoundException
Threads (wait (), sleep (), etc.) - D'après mon expérience, les problèmes de threads se manifestent généralement de manière aléatoire, sans exception spécifique. Le fait de devoir faire face à InterruptedException prend beaucoup de temps, bien que je n’aie pas vu l’exception levée.
ou tout ce qui est considéré comme un "Java de base" - l'exception de loin la plus commune selon mon expérience est NullPointerException.