web-dev-qa-db-fra.com

Quelle exception à lever lorsqu'un paramètre / dépendance important est manquant?

Prenez cette méthode

/**
 * @return List of group IDs the person belongs to
 *
 */
public List<String> getGroups() {
    if (this.getId().equals("")) return null;
}

Je voudrais lever l'exception au lieu de retourner null, quelle est l'exception à lever lorsqu'un paramètre/dépendance important n'a pas été défini?

59
Pentium10

J'utiliserais IllegalArgumentException si le paramètre/argument est contrôlé de l'extérieur, ou IllegalStateException si la méthode est juste appelée à tort moment (état). Dans votre cas spécifique, je pense que c'est ce dernier. Une alternative (douteuse) est NullPointerException .

Cela doit cependant être explicitement documenté dans le @throws pour que l'utilisateur en comprenne la raison.

87
BalusC

Que diriez-vous IllegalStateException ?

5
Stefan Kendall

S'il n'est pas possible de garantir que l'identifiant est toujours défini (en l'exigeant dans le constructeur par exemple, où vous pouvez vérifier qu'un identifiant valide a été transmis), je pense que les autres suggestions à lancer IllegalStateException sont corrects. Mais il serait préférable d'essayer de vous assurer que votre objet ne peut pas entrer dans cet état en premier lieu si possible

3
Sam Holder

J'utiliserais une exception IllegalStateException car l'ID est l'état du propriétaire. Si l'ID était passé en paramètre, une exception IllegalArgumentException aurait raison.

3
Arne Burmeister

Au lieu de lever une exception, vous devez simplement renvoyer une liste vide. Si une dépendance/un paramètre n'est pas respecté, il n'y a aucun résultat. D'après les commentaires et le code publiés, il semble que ce soit le comportement attendu. Si l'id est vide, aucun groupe n'est attaché, donc une liste vide.

2
aephyx

Je créerais mon propre type d'exception en étendant Exception. De cette façon, les fonctions d'appel peuvent intercepter cette exception particulière et la gérer avec élégance, le cas échéant. Remarque, vous pouvez faire la même chose avec à peu près tout ce qui étend l'exception, mais je préfère créer mes propres classes d'exception afin que je puisse être très robuste dans ma gestion des exceptions. Bien sûr, cela dépend de vous.

1
Jay