La gestión de excepciones en Java se da a través de la estructura Try Catch, donde se intenta ejecutar un código y se atrapan los errores que se pueden producir durante su ejecución. En teoría de la programación, existen diferentes tipos de errores, entre los que podemos mencionar errores de compilación, errores en tiempo de ejecución, errores de sintaxis, entre otros.
Los errores que trataremos en este post son los errores en tiempo de ejecución. Supongamos que tenemos un programa con un algoritmo matemático con una serie de operaciones que al final arrojan un resultado. Sin embargo, si a la mitad del proceso, por ejemplo, se presenta algo que es matemáticamente imposible, como una división entre 0 o algo por el estilo, entonces nos encontraremos un problema. La ejecución del problema se verá afectada y si ciertas operaciones dependen del resultado de esa división entre 0, toda la ejecución se estropeará dejando el programa inservible.
Existe una manera en la cual podemos evitar esto. La estructura Try Catch es capaz de encerrar el segmento del código que podría causar un excepción. Si se produce un error, el Catch «atrapa» el la excepción y ejecuta una acción determinada. El código se detiene en ese punto y cancela todas las acciones. Con esta estructura no será necesario detener y reiniciar la ejecución del programa.
Una experiencia práctica
Lo que haremos es crear un interfaz en donde enviamos un número cualquiera y Java se encarga de verificar si la cantidad introducida en efecto un número o una letra o símbolo. Si no es un número, se arrojará un error y la ejecución se detendrá.
Crearemos un proyecto nuevo con una interfaz sencilla, con 2 botones (Enviar y Reset), un jLabel y un jTextBox. Ahora programaremos los botones. Empezaré con el botón Reset que es el que menos comandos necesita.
1 2 3 4 |
jTextFieldEntrada.setText(""); jLabelSalida.setText(""); jButtonEnviar.setEnabled(true); jButtonReset.setEnabled(false); |
Con esto lo que haremos es que cuando se presiona el botón Reset, se limpia el campo de texto y se limpia la etiqueta. Ahora programaremos el botón enviar.Primero habilitaremos los botones:
1 2 |
jButtonEnviar.setEnabled(false); jButtonReset.setEnabled(true); |
Ahora creamos una variable que guardará el mensaje.
1 |
String Mensaje = jTextFieldEntrada.getText(); |
Se aquí en adelante es cuando se puede producir algún error. Es hora de abrir el Try Catch. (Les recomiendo consultar el post de abreviaturas en Netbeans. Si escribimos trycatch y presionamos TAB entonces se crea una estructura por sí sola).
1 2 3 4 |
try { } catch (Exception e) { } |
Entre las llaves del try se escribe el código de nuestro programa. En las llaves del Catch se escribe la acción que se va a ejecutar si se produce algún tipo de error.
Lo que haremos es convertir el String del campo de texto a número, a través del Integer.parseInt. Si este comando detecta un caracter no numérico, se arrojará un error.
1 2 |
int numero = Integer.parseInt(Mensaje); jLabelSalida.setText("El número que se introdujo es: "+numero); |
En el código de error lo que haremos será llamar un JOptionPanel que desplegará un mensaje en pantalla indicándole al usuario que el programa sólo acepta valores numéricos.
1 |
JOptionPane.showMessageDialog(null, "El programa solo admite valores numéricos"); |
Ahora veamos como queda la estructura completa:
1 2 3 4 5 6 7 8 9 10 11 |
try { jButtonEnviar.setEnabled(false); jButtonReset.setEnabled(true); String Mensaje = jTextFieldEntrada.getText(); int numero = Integer.parseInt(Mensaje); jLabelSalida.setText("El número que se introdujo es: " + numero); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, "El programa solo admite valores numéricos"); } |
Ahora le agregaremos un par de funcionalidades. Limitaremos los números para evitar que sobrepasen ciertos límites. Supongamos que lo que vamos a recoger es la edad de una persona. No podemos permitir que se introduzca un número negativo.
Tampoco dejaremos que el número sea mayor a 120, ya que actualmente no hay personas con más de 120 años y dudo que alguna vez alguna persona de tal edad vaya a utilizar este software.
Lanzaremos 2 excepciones:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
try { jButtonEnviar.setEnabled(false); jButtonReset.setEnabled(true); String Mensaje = jTextFieldEntrada.getText(); int numero = Integer.parseInt(Mensaje); if (numero < 0) { throw new Exception("El valor introducido no puede ser menor a cero"); } if (numero > 120) { throw new Exception("El valor introducido no puede ser mayor a 120"); } jLabelSalida.setText("El número que se introdujo es: " + numero); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, "El programa solo admite valores numéricos"); } catch (Exception e) { JOptionPane.showMessageDialog(null, e.getMessage()); } |
Es necesario colocar otro catch que atrape estos 2 errores.
1 2 3 |
} catch (Exception e) { JOptionPane.showMessageDialog(null, e); } |
Con esto estamos listos. El código completo luce así:
Estamos listos para probar el funcionamiento de nuestro programa. Primero comprobaremos lo que sucede con este programa sin el trycatch y luego veremos la diferencia con la gestión de excepciones.
[youtube https://www.youtube.com/watch?v=DG_3A3jIe5c]
Espero sus comentarios. Saludos.
Es válida tu opinión. Gracias