Excepciones de Java
Los tutoriales de Java han sido escritos para el JDK 8. Los ejemplos y las prácticas que se describen en esta página no aprovechan las mejoras introducidas en versiones posteriores y pueden utilizar tecnología que ya no está disponible.Consulte los cambios en el lenguaje de Java para obtener un resumen de las características actualizadas del lenguaje en Java SE 9 y las versiones posteriores.Consulte las notas de la versión del JDK para obtener información sobre las nuevas características, las mejoras y las opciones eliminadas o obsoletas de todas las versiones del JDK.
Los controladores de excepciones se asocian a un bloque try proporcionando uno o más bloques catch directamente después del bloque try. No puede haber código entre el final del bloque try y el comienzo del primer bloque catch.
Cada bloque catch es un manejador de excepciones que maneja el tipo de excepción indicado por su argumento. El tipo de argumento, ExceptionType, declara el tipo de excepción que el manejador puede manejar y debe ser el nombre de una clase que herede de la clase Throwable. El manejador puede referirse a la excepción con el nombre.
Los manejadores de excepciones pueden hacer algo más que imprimir mensajes de error o detener el programa. Pueden recuperar el error, pedir al usuario que tome una decisión, o propagar el error a un manejador de nivel superior utilizando excepciones encadenadas, como se describe en la sección
Lista de excepciones de Java
^Excepciones no verificadas / Excepciones en tiempo de ejecuciónLas excepciones no verificadas son excepciones que el compilador de Java no requiere que manejemos. Las excepciones no controladas en Java son las que implementan la clase RuntimeException. Estas excepciones pueden ser lanzadas durante el funcionamiento normal de la máquina virtual de Java. Las excepciones no controladas no necesitan ser declaradas en la cláusula throws del método para ser lanzadas. Por ejemplo, este bloque de código se compilará y ejecutará sin problemas:public class UncheckedExceptions {
La palabra clave throw se utiliza para crear una nueva instancia de Excepción y la palabra clave throws se utiliza para declarar qué tipo de excepciones se pueden esperar cuando se ejecuta un método.Cuando se manejan excepciones en Java, no queremos simplemente lanzar la excepción creada a la parte superior de la pila de llamadas, por ejemplo, al método main. Eso significaría que todas y cada una de las excepciones lanzadas bloquearían la aplicación y esto no es lo que debería ocurrir. En su lugar, queremos manejar las excepciones de Java, al menos las que podemos manejar, y ayudar a solucionar el problema o fallar con gracia.Java nos da varias maneras de manejar las excepciones.Lanzar excepcionesUna excepción en Java puede ser manejada usando la palabra clave throw y creando una nueva excepción o volviendo a lanzar una excepción ya creada. Por ejemplo, el siguiente método, muy ingenuo y sencillo, crea una instancia de la clase File y comprueba si el archivo existe. Si el fichero no existe el método lanza una nueva IOException:public File openFile(String path) throws IOException {
Catch(excepción java)
Al igual que Java, Scala tiene una construcción try/catch/finally para permitirte atrapar y gestionar excepciones. La principal diferencia es que, por coherencia, Scala utiliza la misma sintaxis que utilizan las expresiones de coincidencia: sentencias case para coincidir con las diferentes excepciones posibles que pueden ocurrir.
Aquí hay un ejemplo de la sintaxis try/catch de Scala. En este ejemplo, openAndReadAFile es un método que hace lo que su nombre indica: abre un archivo y lee el texto que contiene, asignando el resultado a la variable llamada text:
Scala utiliza las clases java.io.* para trabajar con archivos, por lo que intentar abrir y leer un archivo puede resultar tanto en una FileNotFoundException como en una IOException. Estas dos excepciones se capturan en el bloque catch de este ejemplo.
Cubriremos más detalles sobre la sintaxis try/catch/finally de Scala en lecciones posteriores, como en las lecciones de “Manejo de errores funcionales”, pero estos ejemplos demuestran cómo funciona la sintaxis. Lo mejor de la sintaxis es que es consistente con la sintaxis de la expresión de coincidencia. Esto hace que tu código sea consistente y más fácil de leer, y no tienes que recordar una sintaxis especial/diferente.
Java try-with-resources
Si hay varios bloques catch, se intentan de uno en uno, empezando por el primero, hasta que se encuentre una coincidencia para la excepción. Se ejecuta el manejador correspondiente (como en el caso anterior), y luego se pasa el control a la siguiente sentencia después de la sentencia try…catch. Los bloques catch posteriores al que coincide siempre se saltan, incluso si el código del manejador lanza una excepción.
Este fragmento de código mostrará “Exception” en lugar de “RuntimeException”. Dado que RuntimeException es un subtipo de Exception, la primera captura (más general) se ajustará. La segunda captura (más específica) nunca se ejecutará.
La lección que hay que aprender de esto es que los bloques catch más específicos (en términos de tipos de excepción) deben aparecer primero, y los más generales deben ser los últimos. (Algunos compiladores de Java le advertirán si un catch nunca puede ser ejecutado, pero esto no es un error de compilación).
Hay alguna sutileza adicional en la especificación. El tipo de e es una unión sintética de los tipos de excepción de la lista. Cuando se utiliza el valor de e, su tipo estático es el supertipo menos común de la unión de tipos. Sin embargo, si e se vuelve a lanzar dentro del bloque catch, los tipos de excepción que se lanzan son los tipos de la unión. Por ejemplo: