solucion excepciones error catch java exception standard-library

excepciones - java lang exception solucion



¿Hay una clase de excepción java estándar que significa "El objeto no se encontró"? (5)

¿Sabes si hay una excepción estándar que se puede usar aquí?

Hay un par de excepciones que podrían usarse (por ejemplo, NoSuchElementException o IllegalArgumentException ) pero la respuesta realmente depende de la semántica que pretenda transmitir:

  • NoSuchElementException tiende a utilizarse cuando se avanza en una secuencia o enumeración, donde lo que tiene aquí es una búsqueda.

  • IllegalArgumentException tiende a dar a entender que el argumento es erróneo, pero en este caso, podría ser que las suposiciones de la persona que llama son incorrectas, o algo que es específico de la lógica de la aplicación.

  • Una excepción personalizada le permite decir (en los javadocs) exactamente lo que significa la excepción. También puede declarar que se verifique ... si corresponde.

(Pero no se UnknownUserException tentado a usar UnknownUserException . Eso sería terriblemente incorrecto, ¡lea el javadoc!)

También vale la pena considerar devolver null , especialmente si la falla de búsqueda es probable que sea un evento bastante común (no excepcional) en su aplicación. Sin embargo , la desventaja de devolver null es que la persona que llama debe verificar null o arriesgarse a una inesperada NullPointerException . De hecho, yo diría que el uso excesivo de null es peor que el uso excesivo de excepciones. El primero puede resultar en aplicaciones poco confiables, mientras que el último es "solo" malo para el rendimiento.

Para Java 8 en adelante, devolver un Optional sería una opción más limpia que devolver un null .

En estas cosas, es importante mirar más allá de los dogmas y tomar una decisión basada en lo que el contexto real requiere.

Considere una función de la siguiente forma general:

Foo findFoo(Collection<Foo> foos, otherarguments) throws ObjectNotFoundException { for(Foo foo : foos){ if(/* foo meets some condition*/){ return foo; } } throw new ObjectNotFoundException(); }

Un caso concreto, por ejemplo, sería:

User findUserByName(Collection<User> users, String name) throws ObjectNotFoundException { for(User user : users){ if(user.getName().equals(name)){ return user; } } throw new ObjectNotFoundException(); }

Estas funciones lanzan una excepción si el objeto no se encuentra. Puedo crear una clase de excepción personalizada para este propósito (en los ejemplos, ObjectNotFoundException ) pero preferiría usar una clase existente. Sin embargo, no pude encontrar ninguna clase de excepción con este significado en la biblioteca estándar de Java. ¿Sabes si hay una excepción estándar que se puede usar aquí?


Con Java 8, recomendaría usar un Opcional para este caso de uso.

Optional<User> findUserByName(Collection<User> users, String name){ Optional<User> value = users .stream() .filter(a -> a.equals(name)) .findFirst(); }

Esto también deja muy claro para quien llama que el opcional puede estar vacío si no se encuentra el valor. Si realmente desea lanzar una excepción, puede usar orElseThrows en Opcional para lograrlo.


Depende del contrato de interfaz documentado de su método:

Si la documentación de su método indica que el argumento del name debe corresponderse con el nombre de un usuario existente, entonces es apropiado lanzar IllegalArgumentException si el nombre no se encuentra, porque significa que la persona que llamó violó los requisitos del método al pasar un nombre que no lo hace corresponde a un usuario.

Si su método no dice que el nombre debe corresponderse con un usuario existente, pasar un nombre desconocido no es un error y no debe lanzar una excepción. Regresar null sería apropiado en esta situación.

Tenga en cuenta que su método findUserByName básicamente reinventa el método Map.get , que devuelve null si no se encuentra la clave especificada.


Se crean excepciones para marcar un comportamiento excepcional. En mi opinión, la situación de objeto no encontrado no es excepcional. Volvería a escribir su método para devolver nulo, si no se encuentra el usuario.

User findUserByName(Collection<User> users, String name) { for(User user : users){ if(user.getName().equals(name)){ return user; } } return null; }

Este es un comportamiento estándar para muchas Colecciones Java. Por ejemplo, http://docs.oracle.com/javase/7/docs/api/java/util/Map.html#get(java.lang.Object) devolverá nulo, cuando no haya ninguna entrada con la clave especificada en el mapa.

Debe evitar depender de excepciones en la lógica de su programa.


IllegalArgumentException veces se usa aquí, pero usar su propia Exception está perfectamente bien.

Como comentario adicional, recomendaría usar un mapa con String name como la clave y el User como el valor. Iterar la colección sería innecesario y evitaría tener dos usuarios con el mismo nombre en la colección. Si no desea utilizar un Mapa, defiéndalo al menos contra NullPointerException manera:

User findUserByName(Collection<User> users, String name) throws ObjectNotFoundException { if (name == null) { throw new IllegalArgumentException("name parameter must not be null"); } if (users == null) { throw new IllegalArgumentException("Collection of users must not be null"); } for(User user : users) { if(name.equals(user.getName())) { return user; } } throw new ObjectNotFoundException("Unable to locate user with name: " + name); }