¿Deberían los métodos que arrojan RuntimeException indicarlo en la firma del método?

86

Por ejemplo, muchos métodos en frameworks / JDK pueden arrojar

java.lang.SecurityException 

pero esto no se indica en la firma del método (ya que esa es una práctica normalmente reservada para las excepciones comprobadas). Quiero argumentar que declarar RuntimeExceptions en sigs de métodos tiene muchos beneficios (similar a la verificación de tipos estáticos, por ejemplo). ¿Estoy borracho o no?

Jacques René Mesrine
fuente

Respuestas:

70

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 cree que es necesario, pero sabiendo que puede ignorarlo si lo desea. Esto aclara la separación entre marcado y no marcado.

Robin
fuente
4
El compilador de Java no te obliga a manejar las RuntimeExceptions declaradas. Por lo tanto, puede declararlos, con el propósito de "pista" para los desarrolladores. Es discutible, si JavaDoc es un lugar mejor para eso. El punto sobre las excepciones marcadas y no marcadas es importante. Las excepciones marcadas y no marcadas son eso, lo que realmente significa Java con (tiempo de compilación-) Excepciones (marcadas) y RuntimeExceptions (sin marcar).
Guardian667
5
En Spring, la declaración de excepciones no comprobadas en la firma del método comenzó a ser una práctica común.
nascar
38

Desde el tutorial de Oracle Java :

"Si es tan bueno documentar la API de un método, incluidas las excepciones que puede generar, ¿por qué no especificar también las excepciones en tiempo de ejecución?" Las excepciones en tiempo de ejecución representan problemas que son el resultado de un problema de programación y, como tal, no se puede esperar razonablemente que el código del cliente API se recupere de ellos o los maneje 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 indexació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 uno 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.

Dheeraj Vepakomma
fuente
Por lo tanto, el compilador no requiere que capture o especifique excepciones de tiempo de ejecución (aunque puede hacerlo).
nascar
18

Eche un vistazo al javadoc para Collection # add

Hay una gran cantidad de excepciones no comprobadas mencionadas:

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 tiene paciencia, le recomiendo que documente a fondo las posibles excepciones arrojadas por sus métodos de esta manera. En cierto modo, es aún más importante hacer esto para las excepciones no comprobadas, ya que las excepciones comprobadas se autodocumentan (el compilador obliga al código de llamada a reconocerlas).

Sam Barnum
fuente
6
Esta respuesta es incorrecta. Estás hablando de declaraciones Javadoc mientras que la pregunta sobre throwsen la firma del método. Estos no son la misma cosa. Sí, absolutamente debe documentar todas las excepciones lanzadas por su API, pero la pregunta no es sobre eso.
Gili
8

En mi punto de vista, es mejor declarar excepciones en tiempo de ejecución al menos en el 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 mi razón principal para sugerir que proporcione esta información.

Para su información: a medida que ha avanzado el tiempo (ahora en 2017), ahora me inclino mucho más a documentarlos solo en javadoc y evitar las excepciones marcadas tanto como sea posible.

Patrick Cornelissen
fuente
3

En mi opinión, las excepciones no comprobadas nunca deben declararse en la firma del método, ya que son contrarias a su naturaleza.

Sin embargo, si es probable que un método arroje algunas excepciones no comprobadas, observar las circunstancias probables en @throws en Javadoc puede ser útil para que otros invoquen el método para comprender qué puede salir mal. Sin embargo, esto solo es útil para las excepciones que es probable que las personas que llaman puedan manejar (como una NPE debido a una entrada incorrecta, etc.)

Kris
fuente
3

Si está escribiendo una api para que la utilicen otros, entonces hay una amplia razón para la documentación explícita de su intención en la api y no hay inconveniente en declarar RuntimeExceptions en la firma del método.

alphazero
fuente
1

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

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

kgiannakakis
fuente
¿Dónde encaja una excepción de análisis o alguna otra excepción de tipo de validación de datos? Está insinuando que no debe usar excepciones marcadas, pero luego limita para qué se deben usar las excepciones no marcadas.
Robin
1
Lo que estoy diciendo es que el desarrollador no debería verse obligado a detectar excepciones marcadas. Por lo tanto, no es necesario declararlos en la firma del método. En Java, puede transformarlos en excepciones de tiempo de ejecución, como lo está haciendo Spring. También estoy diciendo que las excepciones de tiempo de ejecución deben lanzarse solo en situaciones no recuperables.
kgiannakakis