2010-09-27 9 views
16

Tengo una función que calcula la media de una lista pasada como argumento. Me gustaría saber cuál de excepción de Java debería tirar cuando intento para calcular la media de una lista de tamaño 0.¿Qué excepción arrojar?

public double mean (MyLinkedList<? extends Number> list) 
{ 
    if (list.isEmpty()) 
     throw new ????????; //If I am not mistaken Java has some defined exception for this case 

    //code goes here 
} 

Gracias.

Respuesta

25

Usted puede lanzar una new IllegalArgumentException().

Se lanza para indicar que se ha pasado un método a un argumento ilegal o inapropiado.

Simplemente no olvide pasar un mensaje claro como primer argumento. Esto realmente te ayudará a entender lo que sucedió.

Por ejemplo "No se puede usar mean en una lista vacía".

+0

Bueno, supongo que el mejor método para encontrar qué excepciones manejar es simplemente romper tu programa y dejar que el compilador java te lo diga ... ¿no es así? –

3

Debe crear una nueva clase que extienda Excepción y proporcione detalles específicos de su error. Por ejemplo, podría crear una clase llamada EmptyListException que contenga los detalles sobre su error. Este podría ser una clase de excepción muy simple que no toma argumentos de constructor, pero tal vez llama al super("Cannot generate mean for an empty list"); para proporcionar un mensaje personalizado al seguimiento de la pila.

Muchas veces esto no se hace lo suficiente ... uno de mis olores de códigos más odiados es cuando los desarrolladores usan una excepción genérica (incluso a veces Exception) y pasan un mensaje de cadena al constructor. Hacer esto es válido, pero hace que los trabajos de aquellos que implementan su código sean mucho más difíciles ya que tienen que atrapar una excepción genérica cuando realmente solo pueden suceder algunas cosas. Las excepciones deben tener la misma jerarquía que los objetos que utiliza para los datos, y cada nivel proporciona detalles más específicos. Cuanto más detallada sea la clase de excepción, más detallada y útil será el seguimiento de la pila.

He encontrado este sitio: Exceptional Strategies para ser muy útil al crear excepciones para mis aplicaciones.

1

¿Qué tal una ArithmeticException? Lo mismo que el tiempo de ejecución arroja.

2

Qué tal NoSuchElementException. Aunque IllegalArgumentException podría ser mejor.

1

¿Actualmente está presentando otras excepciones (o planea hacerlo?) Cualquiera de las excepciones mencionadas anteriormente están bien, o simplemente cree las suyas propias. Lo más importante es propagar el mensaje de lo que salió mal.

Si existe la posibilidad de que el "receptor" de la excepción pueda volver a lanzarlo, entonces es posible que desee investigar cualquier otra excepción que el "receptor" también pueda arrojar.

7

La pregunta que debes hacerte primero es si deberías lanzar en absoluto y luego, si es así, si se trata de una excepción marcada o no.

Por desgracia, no hay industria de las mejores prácticas en decidir estas cosas, como se muestra por esta Stackoverflow respuesta:

In Java, when should I create a checked exception, and when should it be a runtime exception?

Sin embargo, hay algunas consideraciones fundamentales:

  • Su diseño/visión de cómo se supone que funciona este método (¿Es razonable/normal que se llame al método con una lista de tamaño 0)?

  • Coherencia con otros métodos en la clase/paquete

  • cumplimiento de su estándar de codificación aplicables (si lo hay)

Mi opinión:

  • Volver Double.NAN o 0 Si llamar al método con una lista de tamaño 0 es razonable/esperado/normal, contaría sider que devuelve Double.NAN o 0 si 0 es apropiado para el dominio de su problema.

  • Lanza un IllegalArgumentException Si mi diseño dice que la comprobación de una lista vacía es fuertemente la responsabilidad de la persona que llama y la documentación para el método se va a establecer claramente que es responsabilidad de la persona que llama, entonces yo' d usa el estándar sin marcar IllegalArgumentException.

  • Lanza una excepción personalizada comprobado Si el método es parte de un paquete de estadísticas o biblioteca donde las funciones de varias estadísticas deben hacer frente a un posible conjunto de datos vacío, yo creo que esto es una condición de excepción que forma parte de el dominio del problema Crearía una excepción personalizada (probablemente marcada) (por ejemplo, EmptyDataSetException) para formar parte de la clase/paquete/biblioteca y usarla en todos los métodos aplicables. Convertirlo en una excepción comprobada ayuda a recordar al cliente que considere cómo manejar la condición.

1

No estoy seguro de que deba lanzar una excepción; el promedio de "nada" es "nada" o 0 si se quiere. Si el conjunto está vacío, simplemente debe devolver 0.

Si realmente DEBE lanzar una excepción, entonces IllegalStateException o IllegalArgumentException son sus mejores opciones.

Cuestiones relacionadas