Módulo 7:
Tópicos Avanzados 1. Excepciones |
Una excepción en Java sucede cuando existe un error de ejecución, a continuación mostramos algunos ejemplos: Ejemplo 1: cuando el usuario hace un cálculo con división por cero: import java.io.*; public class AplicacionExcepcion { public static void despliegaDivision() { System.out.println(" Arithmetic Exception con = " + 3 / 0); } public static void main(String[] args) { despliegaDivision(); } } Esto muestra la ventana de ejecución: Ejemplo: Cuando un usuario de letras en lugar de números en la siguiente aplicación: La cual lanzará una excepción al tener un error de ejecución como se muestra en la ventana de ejecución del DOS: En la ventana observamos que la excepción lanzada es java.lang.NumberFormatException con el dato dd, esto sucede al querer tomar el entero con el metodo parseInt en el applet que utilizamos en alguna sección anterior: import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="400" height="400" code="AppletCiclos1"></applet> public class AppletCiclos1 extends Applet implements ActionListener { Label l1, l2, l3,l4; TextField t1, t2,t3; TextArea ta; Button b; public AppletCiclos1() { l1 = new Label("Inversión Inicial"); t1 = new TextField(8); l2 = new Label("% interes mensual"); t2 = new TextField(5); l3 = new Label("Inversión Final"); t3 = new TextField(8); l4 = new Label("Resultados de la Inversión"); ta = new TextArea(20,30); b = new Button("VER MES"); add(l1); add(t1); add(l2); add(t2); add(l3); add(t3); add(b); add(l4); add(ta); b. addActionListener(this); } public void actionPerformed(ActionEvent ae) { double invinicial = Double.parseDouble(t1.getText()); double interes = Double.parseDouble(t2.getText()); double invfinal = Double.parseDouble(t3.getText()); ta.setText(""); int mes = 1; double saldo = invinicial; while (saldo < invfinal) { saldo = saldo * (1 + interes/100); ta.append(" mes " + mes + " Saldo = " + saldo + "\n"); mes ++; } } } En Java existen una serie de clases que sirven para definir todas las posible excepciones, estas clases todas heredan de la clase Throwable. Una excepción se puede anticipar al utilizar las instrucciones try/catch. El try/catch es la instrucción en Java para poder "atrapar" una Excepcion y poder manejarla. El formato es: try { instrucciones que pueden lanzar una excepción } catch (Clase-Excepcion objeto) { instrucciones para manejar la excepción } La manera más comun de usar esto es poner las instrucciones que pudieran lanzar una excepcion dentro del try de manera que si se lanza una excepción, esta se maneje con las instrucciones que estén dentro de la instrucción catch como se ilustra en el siguiente:import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="550" height="400" code="AppletCiclos5"></applet> public class AppletCiclos5 extends Applet implements ActionListener { Label l1, l2, l3,l4; TextField t1, t2,t3; TextArea ta; Button b; public AppletCiclos5() { l1 = new Label("Inversión Inicial"); t1 = new TextField(8); l2 = new Label("% interes mensual"); t2 = new TextField(5); l3 = new Label("Inversión Final"); t3 = new TextField(8); l4 = new Label("Resultados de la Inversión"); ta = new TextArea(10,70); b = new Button("VER MES"); add(l1); add(t1); add(l2); add(t2); add(l3); add(t3); add(b); add(l4); add(ta); b. addActionListener(this); } public void actionPerformed(ActionEvent ae) { try { double invinicial = Double.parseDouble(t1.getText()); double interes = Double.parseDouble(t2.getText()); double invfinal = Double.parseDouble(t3.getText()); ta.setText(""); int mes = 1; double saldo = invinicial; while (saldo < invfinal) { saldo = saldo * (1 + interes/100); ta.append(" mes " + mes + " Saldo = " + saldo + "\n"); mes ++; } } catch (NumberFormatException nfe) { ta.setText("Error en los datos, deben ser numéricos" + nfe.toString()); } } } Esto se observa asi: Utilizamos nfe como objeto por utilizar las siglas de la Clase de Excepción, N umber F ormat E xception, es común que pongamos el toString() para ver el error completo en el mensaje de error: catch
(NumberFormatException nfe) { Cuando ocurre una situación anormal (puede ser un error de ejecución o algo que el programador defina como no normal), un método (llamado) puede crear un objeto de excepción y después lanzarlo. Si el método (que llamó al anterior) no está preparado para atrapar el objeto de excepción, este lanza el objeto de excepción al método que lo ha llamado previamente y asi sucesivamente en forma consecutiva hasta llegar al método main. El objeto de excepción pasa a través de la secuencia de métodos que han sido llamados hasta que algún método lo atrapa y lo maneja. El método que atrapa el objeto de excepción utiliza la información que se encuentra en el objeto para manejar la excepción. Se puede manejar mas de un catch para un mismo try, es decir si tenemos una serie de instrucciones dentro del try que pueden lanzar varias excepciones, estas se declaran con varios catch, como se muestra en el mismo ejemplo: import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="550" height="400" code="AppletCiclos6"></applet> public class AppletCiclos6 extends Applet implements ActionListener { Label l1, l2, l3,l4; TextField t1, t2,t3; TextArea ta; Button b; public AppletCiclos6() { l1 = new Label("Inversión Inicial"); t1 = new TextField(8); l2 = new Label("% interes mensual"); t2 = new TextField(5); l3 = new Label("Inversión Final"); t3 = new TextField(8); l4 = new Label("Resultados de la Inversión"); ta = new TextArea(10,70); b = new Button("VER MES"); add(l1); add(t1); add(l2); add(t2); add(l3); add(t3); add(b); add(l4); add(ta); b. addActionListener(this); } public void actionPerformed(ActionEvent ae) { try { double invinicial = Double.parseDouble(t1.getText()); double interes = Double.parseDouble(t2.getText()); double invfinal = Double.parseDouble(t3.getText()); ta.setText(""); int mes = 1; double saldo = invinicial; while (saldo < invfinal) { saldo = saldo * (1 + interes/100); ta.append(" mes " + mes + " Saldo = " + saldo + "\n"); mes ++; } } catch (NumberFormatException nfe) { ta.setText("Error en los datos, deben ser numéricos" + nfe.toString()); } catch (NullPointerException npe) { ta.setText("Error en las instrucciones" + npe.toString()); } catch (Exception e) { ta.setText("Error en algo" + e.toString()); } } } De esta manera se sugiere que primero esten los catch de las Excepciones detalladas y luego el de las generales, es decir por ejemplo de la clase Exception se pueden derivar diferentes excepciones, por eso esa se deja para el último. |
Ejercicio |
1. Utiliza el try/catch para poder manejar las excepciones del ejercicio de arreglos, puede ser el de una dimensión o el de dos dimensiones, de manera que si se da un elemento fuera del arreglo se pueda validar. |
Ligas sugeridas |
http://java.sun.com/docs/books/tutorial/essential/exceptions/ |