English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In this tutorial, we will learn how to handle exceptions using the throw and throws keywords with the help of examples.
In Java, exceptions can be divided into two types:
Unchecked exceptions:They are checked at runtime, not at compile time, for example: ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException, exceptions under the Error class, and so on.
Checked exceptions:Revise them at compile time. For example, IOException, InterruptedException, and so on.
Por favor, consulteExcepciones de JavaPara obtener más detalles sobre las excepciones comprobadas y no comprobadas.
Generalmente, no necesitamos manejar excepciones no comprobadas. Esto se debe a que las excepciones no comprobadas ocurren debido a errores de programación. Y corregirlos en lugar de manejarlos es una buena costumbre.
Ahora, este tutorial se centrará en cómo usar throw y throws para manejar excepciones comprobadas.
Usamos la palabra clave throws en la declaración del método para declarar los tipos de excepciones que pueden ocurrir.
Su sintaxis es:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2 ... { // code }
Como se puede ver en la sintaxis anterior, podemos usar throws para declarar múltiples excepciones.
import java.io.*; class Main { public static void findFile() throws IOException { //Código que puede generar IOException File newFile = new File("test.txt"); FileInputStream stream = new FileInputStream(newFile); } public static void main(String[] args) { try{ findFile(); } catch(IOException e){ System.out.println(e); } } }
Resultado de la salida
java.io.FileNotFoundException: test.txt (No such file or directory)
Cuando ejecutamos este programa, si el archivo test.txt no existe, FileInputStream lanzará una excepción FileNotFoundException que hereda de IOException.
Si el método no maneja las excepciones, debe especificar en la cláusula throws los tipos de excepciones que pueden ocurrir en el método, para que los métodos en el nivel superior de la pila de llamadas puedan manejarlas o especificarlas utilizando la palabra clave throws.
El método findFile() especifica que puede lanzar IOException. El método main() llama a este método y maneja las excepciones lanzadas.
Este es el método que utiliza la palabra clave throws para lanzar múltiples excepciones.
import java.io.*; class Main { public static void findFile() throws NullPointerException, IOException, InvalidClassException { // Código que puede generar NullPointerException … … … // Código que puede generar IOException … … … // Código que puede generar InvalidClassException … … … } public static void main(String[] args) { try{ findFile(); }1{ System.out.println(e1.getMessage()); }2{ System.out.println(e2.getMessage()); } } }
Aquí, el método findFile() especifica que puede lanzar NullPointerException, IOException e InvalidClassException en su cláusula throws.
Tenga en cuenta que aún no hemos manejado NullPointerException. Esto se debe a que es una excepción no comprobada. No es necesario especificarlo en la cláusula throws y manejarlo.
Puede haber varios métodos que causen excepciones. Escribir try...catch para cada método será aburrido y el código se volverá largo y difícil de entender.
También es útil throws cuando ya ha comprobado las excepciones que no desea capturar en el método actual (excepciones que deben manejar).
La palabra clave throw se utiliza para lanzar explícitamente una excepción.
Cuando se lanza una excepción, el flujo de ejecución del programa se transfiere del bloque try al bloque catch. Usamos la palabra clave throw en el método.
Su sintaxis es:
lanza throwableObject;
Un objeto Throwable es una instancia de la clase Throwable o de una subclase de Throwable.
class Main { public static void divideByZero() { lanza new ArithmeticException("Intento de división por cero"); } public static void main(String[] args) { divideByZero(); } }
Resultado de la salida
Excepción en el hilo "main" java.lang.ArithmeticException: Intento de división por cero en Main.divideByZero(Main.java:3) en Main.main(Main.java:7) estado de salida 1
En este ejemplo, explícitamente lanzamos ArithmeticException.
Nota: ArithmeticException es una excepción no comprobada. Generalmente no es necesario manejar excepciones no comprobadas.
import java.io.*; class Main { public static void findFile() throws IOException { throw new IOException("El archivo no se encontró"); } public static void main(String[] args) { try { findFile(); System.out.println("El resto del código del bloque try"); } catch (IOException e) { System.out.println(e.getMessage()); } } }
Resultado de la salida
El archivo no se encontró
El método findFile() lanza una IOException utilizando el mensaje pasado a su constructor.
Tenga en cuenta que, como es una excepción de comprobación, debe especificarla en la cláusula throws.
El método que llama a findFile() debe manejar esta excepción o especificarla utilizando la palabra clave throws.
Ya hemos gestionado esta excepción en el método main(). Cuando se lanza la excepción, el flujo de ejecución del programa se transfiere entre los bloques try y catch. Por lo tanto, se saltará el resto del código del bloque try y se ejecutarán las instrucciones del bloque catch.