Java throw vs throws: Dominando el manejo de excepciones con ejemplos prácticos
Java throw vs throws: Dominando el manejo de excepciones con ejemplos prácticos
Esta guía explica cómo usar las palabras clave throw y throws de Java para manejo efectivo de excepciones, ilustrado con muestras de código del mundo real.
En Java, las excepciones caen en dos categorías:
- Excepciones no chequeadas (Unchecked) – no verificadas en tiempo de compilación sino en tiempo de ejecución. Ejemplos:
ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException, y todas las subclases deError. - Excepciones chequeadas (Checked) – forzadas por el compilador. Ejemplos:
IOException,InterruptedException, y muchas otras.
Para un análisis más profundo, ver Excepciones en Java.
Las excepciones no chequeadas usualmente señalan errores de programación; deberían corregirse en lugar de atraparse. Las excepciones chequeadas, por otro lado, representan condiciones que los llamadores deben conocer y manejar.
Usando la palabra clave throws
La cláusula throws declara que un método puede lanzar una o más excepciones, delegando la responsabilidad a los llamadores. Su sintaxis es:
modificadorAcceso tipoRetorno nombreMetodo() throws TipoExcepcion1, TipoExcepcion2 { /* código */ }
Puedes listar múltiples tipos de excepción, separados por comas.
Ejemplo 1: Declarando una excepción chequeada
import java.io.*; class Main { public static void encontrarArchivo() throws IOException { // Código que puede disparar IOException File nuevoArchivo = new File("test.txt"); FileInputStream stream = new FileInputStream(nuevoArchivo); } public static void main(String[] args) { try { encontrarArchivo(); } catch (IOException e) { System.out.println(e); } } }
Salida
java.io.FileNotFoundException: test.txt (No such file or directory)
Si test.txt falta, FileInputStream lanza un FileNotFoundException, que es subclase de IOException. Como encontrarArchivo() declara throws IOException, el método main() debe manejar o propagar la excepción.
Lanzando múltiples excepciones
Puedes declarar varios tipos de excepción en una sola cláusula throws:
import java.io.*; class Main { public static void encontrarArchivo() throws NullPointerException, IOException, InvalidClassException { // Potencialmente lanza NullPointerException … // Potencialmente lanza IOException … // Potencialmente lanza InvalidClassException … } public static void main(String[] args) { try { encontrarArchivo(); } catch (IOException e1) { System.out.println(e1.getMessage()); } catch (InvalidClassException e2) { System.out.println(e2.getMessage()); } } }
Observa que NullPointerException es no chequeada, así que no necesita ser atrapada o declarada por el llamador.
Cuándo usar throws vs. try...catch
Incrustar try...catch en cada método que pueda lanzar una excepción puede ensuciar el código y oscurecer la lógica. Declarar throws mantiene la firma del método limpia y permite al código de nivel superior decidir cómo manejar errores.
Usando la palabra clave throw
La sentencia throw lanza explícitamente una instancia de excepción, transfiriendo control al catch coincidente más cercano o terminando el programa si no se maneja.
Sintaxis:
throw objetoThrowable;
Aquí, objetoThrowable es una instancia de Throwable o una de sus subclases.
Ejemplo 2: Lanzando una excepción no chequeada
class Main { public static void dividirPorCero() { throw new ArithmeticException("Intentando dividir por 0"); } public static void main(String[] args) { dividirPorCero(); } }
Salida
Exception in thread "main" java.lang.ArithmeticException: Intentando dividir por 0 at Main.dividirPorCero(Main.java:3) at Main.main(Main.java:7) exit status 1
Como ArithmeticException es no chequeada, atraparla es opcional.
Ejemplo 3: Lanzando una excepción chequeada
import java.io.*; class Main { public static void encontrarArchivo() throws IOException { throw new IOException("Archivo no encontrado"); } public static void main(String[] args) { try { encontrarArchivo(); System.out.println("Resto del código en bloque try"); } catch (IOException e) { System.out.println(e.getMessage()); } } }
Salida
Archivo no encontrado
Aquí, encontrarArchivo() lanza un IOException chequeado, así que los llamadores deben manejar o declararlo. El método main() demuestra atrapando la excepción, previniendo que el programa termine.
Java
- Variables y Literales en Java: Guía Completa
- Dominar Entrada y Salida en Java: Imprimir, Leer y Formatear Datos
- Entender Expresiones, Sentencias y Bloques en Java
- Clases y Objetos en Java: Guía Práctica
- Clases y métodos abstractos en Java: Guía completa
- Dominando clases anidadas e internas en Java: Tipos, ejemplos y mejores prácticas
- Dominando el manejo multi‑excepción en Java
- Dominando Autoboxing y Unboxing en Java: Ejemplos Prácticos y Mejores Prácticas
- Dominando el reemplazo de Strings en Java: replace(), replaceAll() y replaceFirst() explicados
- Java String toLowerCase() y toUpperCase(): Convertir mayúsculas/minúsculas con conciencia de locale
- Domina Java: Entendiendo Objetos, Clases y Conceptos Básicos de POO