La mayoría de las respuestas en este foro han estado hablando de la jerarquía de excepciones y el compilador de Java no las captó, pero trataría de responder esto más desde la perspectiva del diseño y por qué tal vez las cosas fueron diseñadas así.
Básicamente, cuando se llama a una función (o escribir algo de código) una excepción puede ser expulsado de ella basado en tres situaciones diferentes:
Sobre la base de una condición ineludible como falta de disponibilidad de la red o alguna archivo esperado falta en el sistema de archivos.
Sobre la base de una condición evitable pero conocido como Integer.parseInt(String)
puede lanzar NumberFormatException
si la persona que llama pasa una cadena inconvertibles como "Hello"
, pero la persona que llama puede garantizar validaciones adecuados en su lugar antes de pasar en cualquier cadena a la función y completamente acabar con la posibilidad de generar la excepción. Un caso de uso común podría ser validar el campo de formulario age
en una página web antes de pasarlo a capas más profundas que realizan la conversión.
Una condición desconocido o inesperado En cualquier momento en alguna línea de código puede lanzar una excepción en el código porque había algún error que has hecho y no observó la condición de error hasta que despegó en la producción, por lo general sucede con NullPointer Reference
, IndexOutOfBounds
etc, que si se observa posiblemente corresponde a la categoría 2.
excepciones de categoría 1 están diseñados generalmente como Checked Exceptions
ya que tiene que cumplir la comprobación de las condiciones de error inevitables, y para hacer valer sus retrocesos. Por ejemplo, IOException es una excepción comprobada, porque en caso de que esté abriendo un archivo, puede haber muchas cosas que pueden salir mal (como archivos borrados, permisos, etc.) y la validación previa de todas ellas puede ser muy engorrosa.
Las excepciones del 2do tipo generalmente se modelan como Unchecked Exceptions
porque es posible que tenga su validación previa en su lugar y puede ser irritante que se vea obligado a utilizar try y catch para situaciones que ya se han ocupado.
Las excepciones del 3er tipo no necesitan preocuparse en general porque no se puede poner el manejo de errores en todas y cada una de las sentencias del código de la aplicación que pueden surgir inesperadamente. Pero a veces puede colocar un controlador global, en algún lugar en la pila de llamadas desde donde se ejecuta casi todo el código de la aplicación y manejarlo de manera genérica para que su aplicación no se bloquee debido a un error inesperado.
Por ejemplo, si está ejecutando una aplicación web, puede configurar su Servlet Container para enviar un 500 Internal Server Error
genérico por cualquier error no controlado en su aplicación. O bien, si está ejecutando una aplicación Java independiente, puede guardar los contenidos de su main method
en un bloque try catch
para evitar bloqueos de la aplicación.
Tenga en cuenta que 'RuntimeExceptions' generalmente se lanzan cuando se produce un error de programación/lógica de código. La solución generalmente es simplemente arreglar el código. Por lo general, no debes atraparlos. – BalusC
¿De verdad? Creo que una de las mejores prácticas es convertir una excepción marcada a una excepción sin marcar que capturarlas todas en un lugar para mostrarlas al usuario. – vodkhang
@ vodkhang lo que intento decir es por qué el compilador no prohíbe un código cuando está claro que habrá una RuntimeException. –