1. Conociendo las excepciones
Empecemos con una analogía sencilla. Imagina que tu programa es un coche que circula por la carretera. Todo va bien hasta que ocurre algo inesperado: se pincha una rueda, se acaba la gasolina, se sobrecalienta el motor. Si no «manejas» esta situación (por ejemplo, poner la rueda de repuesto o repostar), el coche se detiene y no sigue. Lo mismo ocurre en un programa: si no manejas la excepción, la aplicación terminará de forma abrupta.
Excepción (exception) — es un objeto que se crea en el momento en que surge algún problema durante la ejecución del programa. La excepción avisa: «¡Alto! ¡Algo ha salido mal!»
Ejemplos de situaciones en las que se producen excepciones:
- División entre cero (10 / 0)
- Intentar acceder a un elemento inexistente del array (arr[999])
- Abrir un archivo que no existe en el disco
- Convertir la cadena "abc" a un número (Integer.parseInt("abc"))
Importante: Las excepciones no son errores de compilación (por ejemplo, erratas en el código), sino problemas que aparecen durante la ejecución del programa.
¿Por qué las excepciones son algo bueno?
- Código limpio: La lógica principal del programa no se ensucia con comprobaciones constantes para cada pequeña cosa.
- Flexibilidad: Puedes manejar los errores de forma centralizada (por ejemplo, todos los errores de lectura de archivos en un mismo lugar).
- Fiabilidad: La aplicación no «se cae» con un mensaje críptico, sino que indica qué ocurrió exactamente.
2. Excepciones (Exceptions) vs Errores (Errors)
En Java hay dos tipos principales de problemas que pueden surgir durante la ejecución del programa:
Errores (Errors)
Los errores son problemas fatales e irrecuperables que se deben a fallos de la propia máquina virtual de Java (JVM). Suelen estar relacionados con los recursos del equipo o con fallos internos de la JVM.
Ejemplos de errores:
- OutOfMemoryError — se ha agotado la memoria.
- StackOverflowError — desbordamiento de la pila (por ejemplo, por una recursión infinita).
Importante: Por lo general no merece la pena intentar manejarlos en el programa.
Excepciones (Exceptions)
Las excepciones son problemas con los que el programa puede (y debe) lidiar. Surgen por errores en la lógica del programa o por factores externos (por ejemplo, el usuario introdujo algo distinto de lo esperado).
Ejemplos de excepciones:
- NullPointerException — intentar usar null como un objeto.
- ArrayIndexOutOfBoundsException — salirse de los límites del array.
- IOException — error al trabajar con archivos.
En Java hay dos tipos de excepciones:
- Checked exceptions (comprobadas) — el compilador exige que se manejen (por ejemplo, IOException).
- Unchecked exceptions (no comprobadas) — el compilador no exige su manejo (por ejemplo, NullPointerException).
Esquema: dónde se ubica cada cosa
graph TD
Throwable --> Error
Throwable --> Exception
Exception --> RuntimeException
Exception --> Checked["(otras Exceptions)"]
style Throwable fill:#ffa64d,color:#000
style Exception fill:#ffa64d,color:#000
style Checked fill:#ffa64d,color:#000
style Error fill:#ff4d4d,color:#fff
style RuntimeException fill:#4dff88,color:#000
Explicación:
- Throwable — la raíz de toda la jerarquía de errores y excepciones en Java.
- Error — errores fatales de la JVM; no se manejan.
- Exception — excepciones «normales» que se pueden y deben manejar.
- RuntimeException — excepciones no comprobadas (errores del programador).
3. ¿Cómo se ve en el código?
Ejemplo 1: División entre cero
public class ExceptionDemo
{
public static void main(String[] args)
{
int a = 10;
int b = 0;
int c = a / b; // ¡Aquí se producirá ArithmeticException!
System.out.println("Resultado: " + c);
}
}
¿Qué ocurrirá?
El programa terminará con un error y verás el mensaje:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ExceptionDemo.main(ExceptionDemo.java:5)
Ejemplo 2: Acceso a un elemento inexistente de un array
int[] arr = {1, 2, 3};
System.out.println(arr[10]); // ArrayIndexOutOfBoundsException
Ejemplo 3: Trabajo con archivos
import java.io.FileReader;
import java.io.IOException;
public class FileDemo
{
public static void main(String[] args) throws IOException
{
FileReader reader = new FileReader("nofile.txt"); // FileNotFoundException (checked)
int data = reader.read();
System.out.println(data);
reader.close();
}
}
Y ahora veremos cómo manejar con elegancia este tipo de situaciones excepcionales.
GO TO FULL VERSION