2009-05-05 15 views
51

Por ejemplo, muchos métodos en los marcos/JDK pueden tirar¿Deberían los métodos que lanzan RuntimeException indicarlo en la firma del método?

java.lang.SecurityException 

pero esto no está indicado en la firma del método (ya que es una práctica normalmente reservado para excepciones controladas). Quiero argumentar que la declaración de RuntimeExceptions en el método sigs tiene muchos beneficios (similar a la comprobación de tipo estático, por ejemplo). ¿Estoy borracho o no?

Respuesta

42

No declararía una excepción sin marcar en la firma, ya que es engañosa para el usuario de esa API. Ya no es obvio si la excepción debe manejarse explícitamente.

Declararlo en el javadoc es un mejor enfoque, ya que le permite a alguien manejarlo si lo considera necesario, pero sabiendo que puede ignorarlo si lo desea. Esto hace que la separación entre claro y sin marcar sea claro.

+1

El compilador de java no lo obliga a manejar las RuntimeExceptions declaradas. Para que pueda declararlos, para el propósito como una "pista" para los desarrolladores. Es discutible, si JavaDoc es un lugar mejor para eso. El punto sobre Excepciones marcadas y no marcadas es importante. Las excepciones controladas y no comprobadas son lo que realmente significa Java con (Compiletime-) Exceptions (checked) y RuntimeExceptions (no seleccionado). – Guardian667

+2

En Spring, la declaración de excepciones sin marcar en la firma del método comenzó a ser una práctica común. – danidacar

4

En mi opinión, es mejor declarar las excepciones de tiempo de ejecución al menos en javadoc para el método. Declararlo en la firma hace que sea aún más obvio lo que puede suceder cuando algo sale mal. Esta es la razón principal por la que sugiero proporcionar esta información.

FYI: como el tiempo ha progresado (ahora en 2017) ahora me inclino mucho más a documentarlos en javadoc y evitar las excepciones comprobadas tanto como sea posible.

1

Esto tiene que ver con la discusión sobre checked exceptions. La mayoría estaría de acuerdo en que las excepciones no deberían declararse en las firmas de métodos.

También hay un discussion con respecto a cómo se deben usar las excepciones de tiempo de ejecución. Estoy de acuerdo con un cartel en que las excepciones de tiempo de ejecución deben denotar un error de programación o una condición fatal. Entonces no hay mucho mérito al declararlos en la firma. Cada método podría potencialmente a través de uno.

+0

Donde encaja una excepción de análisis u otra excepción de tipo de validación de datos en ese momento. Está dando a entender que no debe usar excepciones comprobadas, sino que debe limitar el uso de las excepciones sin marcar. – Robin

+1

Lo que estoy diciendo es que el desarrollador no debería verse obligado a atrapar excepciones marcadas. Entonces no hay necesidad de declararlos en la firma del método. En Java, puede transformarlos en excepciones de tiempo de ejecución, como lo hace Spring. También digo que las excepciones de tiempo de ejecución deberían arrojarse solo en situaciones no recuperables. – kgiannakakis

3

En mi opinión, las excepciones sin marcar nunca se deben declarar en la firma del método, ya que eso es contrario a su naturaleza.

Si, sin embargo, es probable que un método arroje algunas excepciones sin marcar, las circunstancias probables en @throws en Javadoc pueden ser útiles para otros que invocan el método para comprender qué puede salir mal. Esto sólo es útil, aunque para excepciones que las personas que llaman es probable que sea capaz de manejar (como un NPE debido al mal de entrada, etc.)

15

Tome una mirada en el Javadoc para Collection # añaden

Hay un todo serie de excepciones sin marcar, mencionó:

Throws: 
UnsupportedOperationException - add is not supported by this collection. 
ClassCastException - class of the specified element prevents it from being added to this collection. 
NullPointerException - if the specified element is null and this collection does not support null elements. 
IllegalArgumentException - some aspect of this element prevents it from being added to this collection. 

Si usted tiene la paciencia, me gustaría recomendar documentar minuciosamente las posibles excepciones lanzadas por sus métodos de esta manera. En cierto modo, es aún más importante hacer esto para las excepciones no verificadas, ya que las excepciones comprobadas son de alguna manera autodocumentadas (el compilador obliga al código de llamada a reconocerlas).

+1

Esta respuesta es incorrecta. Está hablando de enunciados Javadoc mientras que la pregunta sobre 'throws' en la firma del método. Estos no son la misma cosa. Sí, absolutamente * debes * documentar todas las excepciones lanzadas por tu API, pero la pregunta no es sobre eso. – Gili

3

Si está escribiendo una API para su uso por parte de terceros, existe un amplio motivo para la documentación explícita de su intención en la API y no hay inconvenientes para declarar RuntimeExceptions en la firma del método.

21

De the Oracle Java tutorial:

"Si es tan buena para documentar la API de un método, incluidas las excepciones puede lanzar, por qué no especificar excepciones de tiempo de ejecución también?" Las excepciones en tiempo de ejecución representan problemas que son el resultado de un problema de programación , y, como tal, el código del cliente API no puede razonablemente ser espera recuperarse de ellos o manejarlos de ninguna manera. Tales problemas incluyen excepciones aritméticas, como dividir por cero; excepciones de puntero, como intentar acceder a un objeto a través de una referencia nula; y excepciones de indización, como intentar acceder a un elemento de matriz a través de un índice que es demasiado grande o demasiado pequeño.

Las excepciones de tiempo de ejecución pueden ocurrir en cualquier parte de un programa, y ​​en un típico pueden ser muy numerosas. Tener que agregar excepciones de tiempo de ejecución en cada declaración de método reduciría la claridad de un programa.

+0

Por lo tanto, el compilador no requiere que capture o especifique excepciones de tiempo de ejecución (aunque puede hacerlo). – danidacar

Cuestiones relacionadas