Lorsque vous effectuez des contrôles nuls dans le code Java et que vous générez IllegalArgumentExceptions pour des valeurs null, quel type de modèle de message utilisez-vous?
Nous avons tendance à utiliser quelque chose comme ça
public User getUser(Ssortingng username){ if (username == null){ throw new IllegalArgumentException("username is null"); } // ... }
Quoi de mieux: “est nul” ou “était nul”, et pourquoi?
Pour moi “est nul” se sent plus naturel.
Étant donné que l’ Exception
est levée en raison d’un échec de la vérification préalable, je pense que plutôt que de simplement énoncer un fait, vous devriez indiquer l’ exigence qui a été violée.
Autrement dit, au lieu de dire "username is null"
, dites "username should not be null"
.
En guise d’astuce, vous pouvez utiliser l’une des nombreuses bibliothèques conçues pour faciliter les contrôles de précondition. De nombreux codes dans Guava utilisent com.google.common.base.Preconditions
Méthodes statiques simples à appeler au début de vos propres méthodes pour vérifier les arguments et l’état corrects. Cela permet des constructions telles que
if (count <= 0) { throw new IllegalArgumentException("must be positive: " + count); }
être remplacé par le plus compact
checkArgument(count > 0, "must be positive: %s", count);
Ce qui est plus directement pertinent ici, c'est qu'il a checkNotNull
, ce qui vous permet d'écrire simplement:
checkNotNull(username, "username should not be null");
Notez comment naturellement le code ci-dessus se lit, avec le message détaillé indiquant explicitement l’ exigence qui a été violée.
L'alternative consistant à énoncer des faits est plus délicate:
// Awkward! checkArgument(count > 0, "is negative or zero: %s", count); checkNotNull(username, "username is null");
De plus, cela est aussi potentiellement moins utile, car le client est peut-être déjà au courant du fait, et l’exception ne l’aide pas à comprendre quelles sont les exigences réelles.
IllegalArgumentException
vs NullPointerException
Alors que votre code d'origine lève IllegalArgumentException
sur null
arguments null
, IllegalArgumentException
de Guava lève plutôt NullPointerException
.
Ceci est conforme à la directive définie par l'API:
NullPointerException
: les applications doivent émettre des instances de cette classe pour indiquer d'autres utilisations illégales de l'objectnull
.
De plus, voici une citation tirée de Effective Java 2nd Edition: Article 60: Favorisez l’utilisation des exceptions standard :
On peut soutenir que toutes les invocations de méthode erronées se résument à un argument ou à un état illégal, mais d'autres exceptions sont couramment utilisées pour certains types d'arguments et d'états illégaux. Si un appelant transmet la valeur
null
à un paramètre pour lequel les valeurs null sont interdites, la convention stipule queNullPointerException
être levée plutôt queIllegalArgumentException
.
est nul , puisque l’argument est toujours nul ..
Cependant, pourquoi ne pas simplement lancer une exception NullPointerException sans message?
Je suggérerais de dire
if (userName == null) { throw new IllegalArgumentException("username == null"); }
comme cela est si fatal qu’un programmeur doit le regarder quand même. Faire référence à l’extrait de code incriminé dans le message d’exception est la chose la plus concise que je puisse imaginer.
Je serais enclin à écrire ceci:
public User getUser(Ssortingng username) { if (username.length() == 0) { throw new IllegalArgumentException("username is empty"); } // ... }
Cela tue deux oiseaux avec une pierre. Premièrement, il détecte le cas où le nom d’utilisateur est une chaîne vide, ce qui (par souci d’argument), je suppose, est une erreur. Deuxièmement, si le paramètre est null
tenter de répartir l’appel de length
nous donnera l’ NullPointerException
.