En este tutorial, aprenderemos a usar la palabra clave throw y throws para el manejo de excepciones con la ayuda de ejemplos.
En Java, las excepciones se pueden clasificar en dos tipos:
- Las excepciones sin marcar: No se comprueban en tiempo de compilación, pero al ejemplo de gestión tiempo.Para:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, excepciones en virtud deError
clase, etc. - Excepciones comprobadas: se comprueban en tiempo de compilación. Por ejemplo,
IOException
,InterruptedException
, etc.
Consulte Excepciones de Java para obtener información detallada sobre las excepciones marcadas y no comprobadas.
Por lo general, no es necesario que manejemos excepciones sin marcar. Es porque se producen excepciones no comprobadas debido a errores de programación. Y es una buena práctica corregirlos en lugar de manipularlos.
Este tutorial ahora se enfocará en cómo manejar las excepciones marcadas usando throw
y throws
.
Java lanza palabra clave
Usamos la throws
palabra clave en la declaración del método para declarar el tipo de excepciones que pueden ocurrir dentro de ella.
Su sintaxis es:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Como puede ver en la sintaxis anterior, podemos usar throws
para declarar múltiples excepciones.
Ejemplo 1: Java lanza una palabra clave
import java.io.*; class Main ( public static void findFile() throws IOException ( // code that may produce 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); ) ) )
Salida
java.io.FileNotFoundException: test.txt (No existe tal archivo o directorio)
Cuando ejecutamos este programa, si el archivo test.txt
no existe, FileInputStream
lanza un FileNotFoundException
que extiende la IOException
clase.
Si un método no maneja excepciones, el tipo de excepciones que pueden ocurrir dentro de él debe especificarse en la throws
cláusula para que los métodos que se encuentran más arriba en la pila de llamadas puedan manejarlas o especificarlas usando throws
palabras clave.
El findFile()
método especifica que IOException
se puede lanzar un. El main()
método llama a este método y maneja la excepción si se lanza.
Lanzando múltiples excepciones
Así es como podemos lanzar múltiples excepciones usando la throws
palabra clave.
import java.io.*; class Main ( public static void findFile() throws NullPointerException, IOException, InvalidClassException ( // code that may produce NullPointerException… … … // code that may produce IOException… … … // code that may produce InvalidClassException… … … ) public static void main(String() args) ( try( findFile(); ) catch(IOException e1)( System.out.println(e1.getMessage()); ) catch(InvalidClassException e2)( System.out.println(e2.getMessage()); ) ) )
En este caso, el findFile()
método especifica que puede lanzar NullPointerException
, IOException
y InvalidClassException
en su throws
cláusula.
Tenga en cuenta que no hemos manejado el NullPointerException
. Esto se debe a que es una excepción sin marcar. No es necesario especificarlo en la throws
cláusula y manejarlo.
lanza palabra clave vs. intentar … atrapar … finalmente
Puede haber varios métodos que pueden causar excepciones. Escribir try… catch
para cada método será tedioso y el código se volverá largo y menos legible.
throws
también es útil cuando ha marcado la excepción (una excepción que debe manejarse) que no desea detectar en su método actual.
Palabra clave de lanzamiento de Java
La throw
palabra clave se usa para lanzar explícitamente una única excepción.
Cuando se lanza una excepción, el flujo de ejecución del programa se transfiere del try
bloque al catch
bloque. Usamos la throw
palabra clave dentro de un método.
Su sintaxis es:
throw throwableObject;
Un objeto arrojadizo es una instancia de clase Throwable
o subclase de la Throwable
clase.
Ejemplo 2: palabra clave throw de Java
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Salida
Excepción en el hilo "main" java.lang.ArithmeticException: Intentando dividir por 0 en Main.divideByZero (Main.java:3) en Main.main (Main.java:7) estado de salida 1
En este ejemplo, estamos lanzando explícitamente un ArithmeticException.
Nota: ArithmeticException
es una excepción sin marcar. Por lo general, no es necesario manejar excepciones sin marcar.
Ejemplo 3: Lanzamiento de excepción marcada
import java.io.*; class Main ( public static void findFile() throws IOException ( throw new IOException("File not found"); ) public static void main(String() args) ( try ( findFile(); System.out.println("Rest of code in try block"); ) catch (IOException e) ( System.out.println(e.getMessage()); ) ) )
Salida
Archivo no encontrado
El findFile()
método arroja un IOException
mensaje con el mensaje que le pasamos a su constructor.
Tenga en cuenta que, dado que es una excepción marcada, debemos especificarla en la throws
cláusula.
Los métodos que llaman a este findFile()
método necesitan manejar esta excepción o especificarla usando la throws
palabra clave ellos mismos.
Hemos manejado esta excepción en el main
()
método. El flujo de ejecución del programa se transfiere de un try
bloque a otro catch
cuando se lanza una excepción. Entonces, el resto del código en el try
bloque se omite y catch
se ejecutan las declaraciones en el bloque.