Je n'ai jamais jeter NullPointerException. Pour moi, c'est celui qui apparaît naturellement dans le code quand quelque chose va mal, et qui nécessite un développeur de regarder ce qui se passe. Ensuite (s), il résout la cause et ça ne se reproduise pas.
J'utilise IllegalStateException pour signaler qu'un objet n'est pas correctement configuré ou que les appels sont dans un ordre incorrect. Cependant, nous savons tous que, dans l'idéal, un objet doit s'assurer qu'il ne peut pas être dans un mauvais état et que vous ne pouvez pas l'appeler dans un ordre incorrect (faire d'un constructeur et d'un objet ...).
J'utilise beaucoup de IllegalArgumentException lorsqu'une méthode détecte que ses paramètres sont incorrects. C'est la responsabilité d'une méthode publique, l'arrêt du traitement (pour éviter indirects erreurs qui sont plus difficiles à comprendre). Aussi, quelques if
s dans le début d'une méthode servir un but de la documentation (documentation de ne jamais s'écarter de la code parce que c'est le code :-) ).
public void myMethod(String message, Long id) {
if (message == null) {
throw new IllegalArgumentException("myMethod's message can't be null");
// The message doesn't log the argument because we know its value, it is null.
}
if (id == null) {
throw new IllegalArgumentException("myMethod's id can't be null");
// This case is separated from the previous one for two reasons :
// 1. to output a precise message
// 2. to document clearly in the code the requirements
}
if (message.length()<12) {
throw new IllegalArgumentException("myMethod's message is too small, was '" + message + "'");
// here, we need to output the message itself,
// because it is a useful debug information.
}
}
J'ai aussi l'utilisation spécifique des Exceptions d'Exécution de signal de niveau supérieur des conditions exceptionnelles.
Par exemple, si un module de mon application n'a pas pu démarrer, je pourrais avoir un ModuleNotOperationalException jeté (idéalement par un code générique comme un intercepteur, sinon par un code spécifique) si un autre module qu'il appelle. Après que la décision architecturale, chaque module doit composer avec cette exception sur les opérations qui en appel d'autres modules...