Las excepciones del lenguaje Java

Publicado por pico.dev el .
blog-stack java planeta-codigo programacion
Comentarios

Java

Las excepciones son un mecanismo para capturar y producir condiciones de error en un programa. Es una alternativa al retorno de valores especiales que indique errores y que en estos no son obligatorios su correcta comprobación.

En Java las excepciones están incorporadas en el lenguaje desde la primera versión y que en posteriores se han mejorado. Las palabras reservadas del lenguaje para las excepciones son try, catch, finally para la captura y throw y throws para lanzar excepciones en los métodos.

Las excepciones son objetos que extienden la clase Throwable de la que en el JDK es extendida por la clase Error y Exception de la que de esta última a su vez hereda RuntimeException. Entre las comprobaciones que realiza el compilador está que las excepciones checked lanzadas por un método son capturadas por el código que lo llama.

Solo los objetos que hereden de Throwable pueden ser lanzados y capturados en los bloques try-catch. Las excepciones que heredan de Error son empleadas para casos en los que se han agotado recursos del sistema como la memoria o condiciones de error en el sistema que generalmente impiden el correcto funcionamiento del programa y de difícil tratamiento salvo terminar la ejecución. Las excepciones que heredan de RuntimeExcepcion también se les conoce como uncheked exception y no necesitan declararse en los métodos para ser lanzadas, son empleadas para advertir de errores de programación como dividir por cero produciendo ArithmeticException, desreferenciar un puntero nulo produciendo NullPointerException o acceder a una posición inválida de una array produciendo ArrayIndexOutOfBoundsException. Las excepciones que heredan de Exception pero no de RuntimeException se denominan cheked exceptions y han declararse en los métodos siendo de obligada captura o relanzado para su tratamiento en el método anterior en la pila de llamadas.

Este sería un ejemplo de código que hace uso de una excepción propia para detectar una condición de error mostrando una excepción checked y unchecked.

Aunque las excepciones son un buen mecanismo para el tratamiento de errores se les critica que rompen el flujo de ejecución de un programa y tienen un coste en rendimiento, aunque esta penalización de rendimiento en la mayoría de programas es irrelevante. Algunas recomendaciones que se hace para usar de forma efectiva las excepciones son:

  • Las excepciones no deben reemplazar comprobaciones simples con sentencias if.
  • No se deben microgestionar las excepciones. Los bloques try-catch deben contener bloques de código de varias líneas de código en vez una única sentencia por cada bloque try-catch.
  • Se debe hacer un buen uso de la jerarquía de excepciones y capturar la excepción que se vaya a tratar en el bloque catch. Una excepción se puede convertir en otra por ejemplo convertir un NumberFormatException a IOException.
  • No se deben capturar excepciones para no hacer nada con ellas, esto es no debe haber bloques catch vacíos.
  • En algunos casos es mejor lanzar una excepción que un valor null que posiblemente produzca un NullPointerException en otra parte distante del código de dónde se devolvió el valor null.
  • Propagar excepciones no es un signo de poca sabiduría, puede haber motivos para ello sobre todo si no se le puede dar un tratamiento adecuado.

Cuando se produce una excepción la clase Throwable posee métodos para emitir en la salida un informe de la pila de llamadas, también se puede personalizar la salida. Esta información es esencial y muy útil para conocer la causa de un error ya que indica entre otras cosas cada uno de los métodos, línea en el código fuente y clases donde se ha producido la excepción.