508 votos

Si un método de recuperación de retorno 'null' o lanzar una excepción cuando no puede producir el valor de retorno?

Tengo un método que se supone que debe devolver un objeto si éste se encuentra.

Si no se encuentra, debería:

  1. devolver null
  2. lanzar una excepción
  3. otros

493voto

Ken Puntos 1693

Si siempre estás esperando para encontrar un valor, a continuación, tire de la excepción si es que faltan. La excepción podría significar que hay un problema.

Si el valor pueden estar ausentes o presentes y ambos son válidos para la aplicación de la lógica, a continuación, devolver un valor null.

Más importante: Qué hacer en otros lugares en el código? La consistencia es importante.

99voto

Carlton Jenke Puntos 2483

Sólo lanzar una excepción si se trata realmente de un error. Si es el comportamiento esperado para que el objeto no existe, devolverá el valor null.

De lo contrario, es una cuestión de preferencia.

71voto

Matias Nino Puntos 1710

Como regla general, si el método debe devolver siempre un objeto, y luego ir con la excepción. Si usted anticipa el ocasional nulo y desean hacerlo de una manera determinada, vaya con el valor null.

Hagas lo que hagas, yo aconsejo vivamente en contra de la tercera opción: devuelve una cadena que dice "WTF".

51voto

Kevin Gale Puntos 1984

Si es null nunca indica un error entonces, retorna null.

Si es null es siempre un error, a continuación, lanzar una excepción.

Si es null a veces es una excepción, a continuación, el código de dos rutinas. Una rutina lanza una excepción, y el otro es un booleano prueba de rutina que devuelve el objeto en un parámetro de salida y la rutina devuelve un false si no se encontró el objeto.

Es difícil el uso indebido de un intento de rutina. Es muy fácil olvidarse de comprobar el valor null.

Así que cuando nulo es un error que acaba de escribir

object o = FindObject();

Cuando el valor null no es un error que se puede codificar algo como

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

27voto

Lena Schimmel Puntos 2701

Yo sólo quería una recapitulación de las opciones mencionadas antes, lanzar algunos nuevos en:

  1. devolver null
  2. lanzar una Excepción
  3. utilizar los objetos nulos patrón
  4. proporcionar un parámetro de tipo boolean para usted método, por lo que la persona que llama puede elegir si quiere que lanzar una excepción
  5. proporcionar un parámetro extra, así que el autor de la llamada puede establecer un valor que se obtiene si el valor no se encuentra

O usted puede combinar estas opciones:

Ofrecer varias versiones sobrecargadas de su getter, por lo que el usuario puede decidir qué camino seguir. En la mayoría de los casos, sólo el primero tiene una implementación del algoritmo de búsqueda, y los demás sólo se envuelven alrededor de la primera:

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

Incluso si usted elige proporcionar sólo una aplicación, puede que usted quiera usar una convención de nomenclatura como que aclarar su contrato, y ayuda en caso de que decida añadir otras implementaciones.

Usted no debe demasiado, pero puede ser útil, espeacially la hora de escribir una Clase auxiliar que se utiliza en cientos de aplicaciones diferentes con diferentes error en el manejo de las convenciones.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X