522 votes

Si une méthode de récupération doit retourner ' null ' ou lève une exception lorsqu’il peut ' t produire la valeur de retour ?

J’ai une méthode qui est supposé pour renvoyer un objet s’il est constaté.

Si elle n’est pas trouvé, devrait I:

  1. retourne la valeur null
  2. lever une exception
  3. autres

505voto

Ken Points 1693

Si vous attendez toujours de trouver une valeur puis lève l’exception si elle est manquante. L’exception signifierait qu’il y avait un problème.

Si la valeur peut être absent ou présent et les deux sont valides pour la logique d’application, puis retournent une valeur null.

Plus important : que faites-vous autres endroits dans le code ? Cohérence est important.

103voto

Carlton Jenke Points 2483

Seulement lève une exception si c’est vraiment une erreur. Si c’est le comportement attendu pour que l’objet existe pas, retournent la valeur null.

Sinon, c’est une question de préférence.

75voto

Matias Nino Points 1710

En règle générale, si la méthode doit toujours retourner un objet, puis allez à l’exception. Si vous anticiper la null occasionnelle et que vous voulez pour y faire face d’une certaine façon, aller avec la valeur null.

Quoi que vous fassiez, je vous déconseille fortement la troisième option : retourne une chaîne qui dit « WTF ».

52voto

Kevin Gale Points 1984

Si la valeur est null jamais indique une erreur puis il suffit de retourner la valeur null.

Si la valeur null est toujours une erreur de jeter une exception.

Si la valeur null est parfois une exception alors le code à deux routines. Une routine déclenche une exception et l'autre est une valeur de type boolean test de routine qui retourne l'objet dans un paramètre de sortie et la routine renvoie false si l'objet n'a pas été trouvé.

Il est difficile de l'abus d'Essayer la routine. Il est facile d'oublier de vérifier la valeur null.

Ainsi, lorsque la valeur null est une erreur, il vous suffit d'écrire

object o = FindObject();

Lorsque la valeur null n'est pas une erreur, vous pouvez coder quelque chose comme

if (TryFindObject(out object o)
  // Do something with o
else
  // o was not found

27voto

Lena Schimmel Points 2701

Je voulais juste récapituler les options mentionnées avant, jeter quelques nouvelles:

  1. retourner la valeur null
  2. lever une Exception
  3. utilisation de l'objet nul motif
  4. fournir un paramètre booléen pour vous la méthode, de sorte que l'appelant peut choisir s'il veut vous lancer une exception
  5. fournir un paramètre supplémentaire, de sorte que l'appelant peut définir une valeur qu'il obtient en retour si aucune valeur n'est trouvée

Ou vous pouvez combiner ces options:

Fournir plusieurs versions surchargées de votre getter, de sorte que l'appelant peut décider de la voie à suivre. Dans la plupart des cas, seul le premier a une implémentation de l'algorithme de recherche, et de l'autre ceux qui viennent s'enrouler autour de la première:

Object findObjectOrNull(String key);
Object findObjectOrThrow(String key) throws SomeException;
Object findObjectOrCreate(String key, SomeClass dataNeededToCreateNewObject);
Object findObjectOrDefault(String key, Object defaultReturnValue);

Même si vous choisissez de fournir une seule application, vous pouvez utiliser une convention de nommage comme ça pour clarifier votre contrat, et il vous aide si jamais vous décidez d'ajouter d'autres implémentations.

Vous ne devez pas en abuser, mais il peut être utile, espeacially lors de l'écriture d'une Classe d'assistance qui vous permettra de l'utiliser dans des centaines d'applications différentes avec de nombreuses erreurs de manipulation des conventions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X