2010-02-03 10 views
18

Cuando se marcan las excepciones de los métodos en un constructor que el constructor no puede manejar, está bien capturarlas y descartarlas como una excepción de tiempo de ejecución si está seguro de que la aplicación no puede manejarlo y será inútil sin el objeto que se está construyendo?¿Está bien para los constructores lanzar excepciones de tiempo de ejecución?

+6

Sí, arrojar una excepción desde el constructor es la forma estándar de abortar la creación de un objeto. –

+0

+1 - buena pregunta para los recién llegados a OOP – JonH

Respuesta

11

Sí, esto es inevitable en muchos constructores cuando llaman a otros métodos, ya que siempre existe la posibilidad de que ya emitan excepciones sin marcar.

+0

Este es un buen punto. – insipid

4

Sí, es completamente válido arrojar la excepción en su constructor. Usted tiene poco o ningún otro remedio que hacer esto, especialmente cuando simplemente está tratando de construir un objeto y las cosas simplemente no funcionan bien.

+0

Para aclarar, ¿está diciendo que está bien convertir a una excepción no verificada? ¿O te refieres solo a agregar una cláusula throws? – insipid

+4

Solía ​​lanzar 'IllegalArgumentException' con una cadena que lo describía. – philfreo

1

Sí. A menos que sepa cómo se debe manejar la excepción, es mejor que la arroje, en lugar de simplemente tragarla e imprimir un rastro de pila (o peor, no hacer absolutamente nada).

Esto ayudará a prevenir algunos errores extremadamente difíciles de depurar más adelante.

11

Sí. Esta es una práctica estándar.

En Effective Java, 2nd Ed. esto está cubierto por el elemento 61, "Lanzar excepciones apropiadas para la abstracción". Si Java Effective también incluye la excepción resultante marcada o no seleccionada en el Ítem 58, "Usar excepciones marcadas para condiciones recuperables y excepciones de tiempo de ejecución para errores de programación".

Que esto es un constructor en lugar de un método normal no es realmente un problema. (De hecho, los constructores tienen más libertad ya que no están vinculados por la interfaz del super.)

Al lanzar una excepción como resultado de otra excepción, es una buena idea asegurarse de que está configurando el cause en el nuevo excepción.

+1

+1 for good source – insipid

+1

Todas las respuestas que hacen referencia a Java efectivo se merecen +1 :) – Fredrik

2

Está perfectamente bien lanzar una excepción marcada para indicar que la construcción del objeto falló, como ya comentó Chris Jester-Young. Si es una buena idea lanzar una excepción sin marcar es otro problema. Perderá las molestias del compilador que lo insta a atrapar y manejar la excepción, lo cual seguramente querrá hacer.

+0

¿por qué lo deseas? la mayoría de las veces no quiere manejarlo, es un error, deje que se ejecute en la pila a un registrador/controlador de trabajo. – reto

1

Personalmente, odio ver constructores arrojar excepciones marcadas (como doppeldish ya se señaló). Sin embargo, ¿cómo puede estar seguro de que la aplicación no puede manejar la excepción? Incluso si la aplicación no puede manejarlo, tal vez el usuario pueda, simplemente intentándolo de nuevo.

+0

+1 algo que considerar: P gracias – insipid

Cuestiones relacionadas