Manejo de excepciones.
En esta entrada les hablaré un poco sobre las excepciones en Java y su manejo.
¿Qué es una excepción?
Como se define en el libro de Deitel:
Una excepción es la indicación de un problema que ocurre durante la ejecución de un programa
Se le llama excepción porque se trata de un error que no sucede con frecuencia, es decir “una excepción a la regla”. La “regla”, por supuesto, es la ejecución normal del programa.
Algunos ejemplos de situaciones que generarán excepciones son:
- El usuario introdujo una cadena de caracteres o incluso sólo un carácter cuando el programa esperaba un valor numérico.
- El índice de una casilla de un arreglo está fuera del límite permitido.
- El resultado de una división entre cero.
¿Por qué es necesario manejarlas?
Para el programador novel puede parecer superficial y no necesario procesar las excepciones. Pero si lo piensas como un profesional del software, es necesario generar programas que funcionen en todas las condiciones posibles. Esto incluye errores que puedan ser generados por factores externos, como datos que introduce el usuario, o el acceso a un recurso de hardware.
Como programadores muchas veces nos detenemos solamente en cumplir con los requisitos mínimos, pero existen otros atributos que le pueden añadir valor a nuestro producto software, como la usabilidad y la robustez. Un programa “robusto” puede reponerse a los errores, es decir, no “crashea” fácilmente. Entonces, manejar las excepciones puede añadirle un atributo de robustez al software desarrollado.
Cuando en un programa no se atrapan las excepciones, éste detendrá su ejecución abruptamente. Quizá en un programa sencillo eso no te quite el sueño. Pero piensa que programas más complejos pueden estar haciendo uso de recursos de hardware o software como una base de datos, un puerto de comunicaciones, un controlador, etc., que puede bloquearse para que otros programas no los usen mientras el tuyo los está ocupando. Pero si tu programa se detiene abruptamente, seguramente no habrá liberado apropiadamente estos recursos, impidiendo también que otra aplicación los utilice.
¿Qué no es una excepción?
Como ya puedes estar imaginando, manejar las excepciones te ayudará a crear programas menos susceptibles a los errores. Pero es importante reconocer qué tipo de errores no podrán ser manejados con esta técnica.
Piensa en el siguiente escenario: Estás escribiendo un programa que calcule el promedio de un alumno. Para ello, le pides al usuario las calificaciones de cada asignatura para poder sumarlas y dividirlas entre el número de asignaturas. Para cada calificación parcial, se espera un valor numérico entero en un rango de 0 a 10. Pero si el usuario introduce el valor 2450, te va a generar un problema porque no es un valor válido de calificación. Desafortunadamente Java no detectará esta situación como una excepción, puesto que el usuario está introduciendo un valor entero. Para estos casos, tú deberás escribir más código para asegurarte que el valor introducido se encuentre dentro del rango que deseas.
¿Cuándo sí se disparará la excepción? Si el usuario decide escribir caracteres en lugar de números.
Anuncio de Excepción.
Otra forma que tenemos para “lidiar” con los posibles errores en Java es sólo avisando que un método puede lanzar una excepción. Puedes pensar que un aviso no es tan bueno como ocuparse del problema en sí. (Un aviso de las autoridades policiacas de que en tal calle asaltan no resuelve el problema de inseguridad para los ciudadanos, pero al menos nos pone en estado de alerta y podríamos decidir no caminar por ese lugar).
En Java, “avisar” de una excepción es parecido, pero en cierto modo, nos ahorra escribir código que quizá en un futuro no necesitemos del todo. Este aviso de excepción se logra con la claúsula throws en el encabezado del método, de la siguiente forma:
public tipo nombreMetodo(lista de parámetros) throws TipoDeExcepción {
De esta forma, el método advierte a quienes lo llamen, que puede producirse una excepción al invocarlo. Los métodos que hacen la invocación pueden atrapar o deja pasar la excepción.
La sentencia try-catch-finally.
El mecanismo de manejo de excepciones en Java se realiza a través de la instrucción try-catch. En la figura 1 se muestran las partes de esta instrucción.

Figura 1 – La instrucción try-catch
Dentro del bloque try se escriben las instrucciones que pueden generar una excepción. En español es como si dijéramos. “intenta hacer esto”. Si no se genera una excepción, estas instrucciones se ejecutarán normalmente, y se ignorará el bloque catch.
En caso de que surja una excepción al intentar ejecutar alguna de las instrucciones dentro del bloque try, éstas no se ejecutarán y en su lugar se corren las instrucciones en el bloque catch.
La sentencia try-catch soporta múltiples bloques catch, pues es común que se busque reaccionar específicamente a un tipo de error.
En tanto la sentencia finally es opcional. Pero lo que ahí se encuentre se ejecutará siempre, sin importar si se genere o no una excepción.
A continuación, te muestro un ejemplo de uso de esta sentencia:
public class EjBlog1 { public static void main(String[] args) { int arreglo[] = {1,2,3,4,5}; try{ arreglo[10]=9; }catch(Exception e){ System.out.println(e.toString()); } } }
En este programa, se declara un arreglo de enteros de 5 elementos. Dentro del bloque try, se intenta ejecutar una instrucción: asignarle el valor 9 a la casilla 10 del arreglo. Pero el arreglo sólo tiene 5 casillas. Sin el bloque try, la instrucción se ejecutaría generando una excepción y la detención abrupta del programa. Con el bloque try, resulta que se detecta la excepción y se “atrapa” en el bloque catch. De tal forma que lo que veríamos como resultado de la ejecución de este programa se muestra en la figura 2:

Figura 2 – Salida del programa
El objeto Exception.
Una excepción es un objeto instancia de la clase java.lang.Throwable. El objeto Exception es la clase padre de todas las excepciones que se puedan generar en un programa en Java. Por eso en el primer ejemplo, el objeto creado por el bloque catch es una instancia de Exception.
Pero a partir de esta clase puedes desear “especializar” el catch atrapando el error específico que se genera. Java tiene una jerarquía de clases que extienden de Exception para tratar cada tipo de error posible. En la figura 3 te muestro la jerarquía de excepciones.

Figura 3 – Tipos de Excepciones
Por ejemplo, podríamos reescribir el programa del ejemplo anterior usando el tipo de excepción específico al problema que sabemos que se sucitará:
public class EjBlog2 { public static void main(String[] args) { int arreglo[] = {1,2,3,4,5}; try{ arreglo[10]=9; }catch(ArrayIndexOutOfBoundsException e){ System.out.println(e.toString()); } } }
Y, sin embargo, tendría el mismo efecto en la salida.
Try con múltiples catch
Pero tratar los diferentes tipos de excepciones te podría ayudar a saber qué tipo de error se está generando específicamente. Por ejemplo, observa el siguiente fragmento de programa:
public boolean conectar() throws InstantiationException, IllegalAccessException{ try { Class.forName(driver).newInstance(); conexion = DriverManager.getConnection(url, usuario, password); if (conexion != null) { System.out.println("Conexion a la base de datos: " + url + " EXITOSA"); sentenciaSQL = conexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); return true; } } catch ( SQLException ex) { System.out.println(ex); System.out.println("Problema al conectar con la base de datos: " + url); return false; } catch (ClassNotFoundException ex2){ System.out.println(ex2); System.out.println("Controlador no encontrado, no se puede conectar con " + url); return false; } return false; }
En éste método se intenta (dentro del bloque try) tres cosas:
- Crear una nueva instancia de un controlador (driver)
- Usando ese controlador, se busca conectar con una base de datos.
- Si se logra la conexión, se busca crear un objeto sentenciaSQL que es un objeto tipo Statement, el cual provee la “infraestructura” para ejecutar instrucciones SQL en una base de datos.
El bloque catch está diseñado para atrapar a dos posibles excepciones: una SQLException, y una ClassNotFoundException. Parece que dará lo mismo que el método genere una u otra excepción, pues en ambos casos no logrará conectar con la base de datos.
Sin embargo, el que se genere una u otra excepción ayudará al programador a entender el origen del error:
- Si se genera una ClassNotFoundException, el problema es que el controlador no se encuentra en el lugar señalado, o simplemente se ha escrito de forma incorrecta su nombre.
- En tanto que, si se genera una SQLException, el problema es que no se pudo hacer la conexión a la base de datos, ya sea porque la base de datos no existe, no está bien escrita su nombre, o no se tiene acceso con ese nombre de usuario y/o contraseña.
Tipos de Excepciones.
Aunque ya vimos que cada error puede generar un tipo de excepción diferente, y que por lo tanto, existen muchos tipos de excepciones; genéricamente podemos distinguir sólo dos tipos de excepciones: las checked y las unchecked. Casi todas las clases que heredan de Exception son de tipo checked. En cambio, las excepciones del tipo RuntimeException son de tipo unchecked. Veamos brevemente que quieren decir estos tipos.
Excepciones checked.
Este tipo de excepciones se generan por condiciones diversas que suceden en el momento de la ejecución del programa pero que están fuera del control del programador. Algunos ejemplos son:
- Si al intentar ingresar a un programa que requiere que el usuario se autentique, y éste escribe una contraseña incorrecta.
- Problemas para acceder a un archivo que ha sido borrado del directorio
- Problemas para acceder a una base de datos o a un archivo a través de una red, pero la conexión a la red falla.
Como puedes ver, son muchos problemas los que se pueden ocasionar de este tipo, y que en general el programador no es responsable de estos errores.
Sin embargo, cuando necesitamos ejecutar este tipo de acciones, debemos declararlas en el encabezado del método (Recuerda que al encabezado de un método también se le conoce como la firma del método)
En pocas palabras, una excepción checked, que también puede ser conocida como excepción marcada o excepción comprobada, es revisada por el compilador, por lo que, en tiempo de edición, estamos obligados a una de dos cosas: a manejarla con un bloque try-catch o a avisar de que puede suceder con la sentencia throws. (De lo contrario el programa no compilará)
Excepción unchecked.
En cambio, este tipo de excepciones no son comprobada por el compilador, y se presentan en tiempo de ejecución. Generalmente son errores en el código, en muchas ocasiones causados por errores al codificar y que generan que el programa se comporte de forma incorrecta o inestable.
Para este tipo de excepciones se puede escribir un bloque try-catch para manejarlas, pero en realidad lo mejor para detenerlas es revisar nuestro código, pues reflejan una pobre lógica de programación. Este es el caso del primer ejemplo que se mostró. No tiene sentido intentar acceder a una casilla de arreglo que de antemano sabemos que no existe. Desafortunadamente no siempre es tan claro entender y encontrar este tipo de errores de lógica.
Métodos del objeto Exception.
Como hemos podido ver en los ejemplos mostrados, existen varios métodos que la clase Exception pone a nuestra disposición para manejar el error. Tres de ellos son sumamente importantes:
- getMessage( ) Se usa para obtener un mensaje de error asociado con una excepción.
- printStackTrace( ) Se utiliza para imprimir el registro de la pila donde se ha iniciado la excepción. Este método es bastante útil cuando queremos conocer quien ha llamado al método que genera el error. Entonces nos imprimirá la pila de programa, mostrando los métodos llamados antes de que se suscitará el error.
- toString( ) Se utiliza para mostrar el nombre de la excepción junto con el mensaje que devuelve getMessage().
Debemos recordar que estos métodos imprimirán el mensaje de error en inglés (el idioma original en el que fue programada la clase Exception). Así que quizá sea más recomendable ofrecer una salida en español y más amigable cuando se produzca una excepción.
Difunde el conocimiento.
Esta fue una breve introducción al manejo de excepciones aún queda mucha tela de donde cortar sobre este tema, que quizá en el futuro escriba una entrada más sobre las Excepciones. Sé buen@ y difunde en tus redes sociales.