PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (MANEJO DE EXCEPCIONES) Objetivos El alumno empleará el concepto de excepción en la programación orientada a objetos para el manejo de errores de ejecución. Al final de esta práctica el alumno podrá: Implementar programas orientados a objetos que manejen errores de ejecución. Antecedentes 1. Haber aplicado los conceptos básicos de la programación orientada a objetos en programas sencillos. 2. Manejar sentencias de control de flujo en lenguaje Java. Introducción Una excepción se genera cuando ocurre un error en tiempo de ejecución. En Java es común manejar las excepciones para controlar la ejecución del programa. Es por ello la importancia de conocer cómo se pueden detectar y manipular las diferentes excepciones definidas en el lenguaje. Por ejemplo, si para la correcta ejecución de un programa requiere que los datos se le den desde la línea de comandos, se puede utilizar la excepción llamada IOException, la cual se generará si no se dan los datos de la forma establecida. Una vez que se conoce el tipo de excepción que se puede generar en cierta parte del código de un programa, es necesario emplear la sentencia try-catch para indicar las acciones que debe realizar el programa en caso de que ocurra la excepción. La sintaxis de la sentencia try-catch, se presenta a continuación: try { Código donde puede ocurrir el error } catch (nombre_de_excepción, variable_de_excepción){ Código que se ejecuta en caso de que ocurra el error } Ejemplo 1 Excepción ArrayIndexOutOfBoundsException Cuando se ejecuta una clase definida con parámetros y éstos no se dan desde la línea de comandos, se genera una excepción debido a que se usan localidades de la variable args; al no tener elementos que leer, se genera un ArrayIndexOutOfBoundsException, excepción que puede ser manejada usando try-catch. El siguiente programa incluye el código de manejo de dicha excepción: Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (MANEJO DE EXCEPCIONES) import java.lang.*; public class ComplejoAPolar{ public static void main (String[] args){ try{ ComplejoAPolar cap = new ComplejoAPolar(); double real = Double.parseDouble( args[0] ); double imaginario = Double.parseDouble( args[1] ); double r; double ang; r = cap.obtenMagnitud(real, imaginario); ang = cap.obtenAngulo(real, imaginario); System.out.println("El numero complejo "+real+" +" +imaginario+" i en su forma polar"); System.out.println("es "+r+" exp("+ang+")"); } catch(ArrayIndexOutOfBoundsException aioobe){ System.out.println("ERROR!!"); System.out.println("Sintaxis: java ComplejoAPolar” +” real imaginario"); } } public double obtenMagnitud(double r, double i){ double resultado; resultado = Math.sqrt(Math.pow(r,2)+Math.pow(i,2)); return resultado; } public double obtenAngulo(double r, double i){ double resultado; resultado = Math.atan(i/r); //El resultado de atan es en radianes, se convierte a grados resultado=resultado*180/Math.PI; return resultado; } } La salida del programa, en caso de no incluir los datos de entrada en la línea de comandos al momento de ejecutar la clase, es la siguiente: >java ComplejoAPolar ERROR!! Sintaxis: java ComplejoAPolar real imaginario Ejemplo 2 Lectura de una cadena desde la línea de comandos, y excepción IOException. Este programa leerá una cadena desde la línea de comandos al momento de mandar la orden de ejecución. Para ello se usarán algunas clases predefinidas en java que se encuentran en java.io; estas clases son: Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (MANEJO DE EXCEPCIONES) - InputStreamReader: La cual va leyendo los bytes de la cadena de entrada y los transforma a caracteres. Para leer una cadena completa desde el teclado, se debe generar un objeto de esta clase, cuyo argumento es el medio de entrada de los datos; en este caso es System.in. Por lo tanto la creación de dicho objeto se muestra a continuación: InputStreamReader isr = new InputStreamReader(System.in); - BufferedReader: Esta clase permite una lectura eficiente, y sirve de puente entre el origen de los datos y donde se guardarán. Para ello se debe definir un objeto de esta clase usando el InputStreamReader creado previamente. Además se utilizará el método readLine() definido en esta clase para leer una línea completa. BufferedReader br = new BufferedReader(isr); Este programa podría generar una excepción IOException en caso de no incluir una cadena en el momento de ejecutarlo, por lo que habrá que utilizar try-catch. import java.io.*; public class LeerUnaCadena{ public static void main(String args[]){ try{ // Definir un flujo de caracteres de entrada InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); // Variable para almacenar una línea de texto String sdato; System.out.print("Introduzca un texto: "); sdato = br.readLine(); // leer una línea de texto // Escribir la línea leída System.out.println("La cadena leida es: "+sdato); } catch(IOException ioe){ //La ignorará } } } Otra forma de manejar las excepciones, es utilizando la cláusula throws, que identifica la lista de posibles excepciones que un método puede generar. Esta cláusula se aplica a todo un método, a diferencia de la sentencia try-catch que acota el código susceptible a generar una excepción. Como el método que utiliza throws no tiene código para manejar las excepciones que pueda generar, los métodos que lo invoquen deberán tener protecciones frente a esas excepciones. La declaración del método con uso de throws presenta la siguiente sintaxis. tipo nombreMetodo(argumentos) throws lista_excepciones { código_del_método} Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (MANEJO DE EXCEPCIONES) Ejemplo 3 Programa que solicita una cadena; emplea un método que utiliza la cláusula throws para leer la cadena. import java.io.*; public class LeerUnaCadena{ public static void main(String args[]) { LeerUnaCadena objCad = new LeerUnaCadena(); String cadena; try { // Se invoca al método que puede generar un IOException cadena = objCad.leeCadena(); System.out.println("\n La cadena leida es: "+ cadena); } catch (IOException e) { System.out.println("Error de entrada salida"); } } // Método que da lectura de la cadena; usa throws public static String leeCadena() throws IOException{ // Definición de un flujo de caracteres de entrada InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); // Variable para almacenar una línea de texto String sdato; System.out.print("Introduzca un texto: "); sdato = br.readLine(); // leer una línea de texto return sdato; } } Se puede observar que el método leeCadena emplea la cláusula throws; esto es obligatorio porque la línea sdato = br.readLine(); // leer una línea de texto puede generar un IOException. También es necesario que el método main maneje la excepción IOException. Esto lo hace con la sentencia try-catch mostrada en negritas. A manera de ejercicio de prueba, realiza las siguientes actividades: a) Transcribe el ejemplo 3, compílalo y ejecútalo. Notarás que no hay errores ni de compilación ni de ejecución. b) Ahora elimina la cláusula throws del método leeCadena. La línea debe quedar de la siguiente forma: public static String leeCadena(){ Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (MANEJO DE EXCEPCIONES) Compila el programa. Deberá presentar un mensaje de error y no generará el archivo .class. Explica por qué sucede. c) Vuelve a incluir la cláusula throws al método leeCadena y comenta las siguientes líneas del método main try { } catch (IOException e) { System.out.println("Error de entrada salida"); } Con esto se está excluyendo el manejo de la excepción IOException. Compila el programa. Notarás que también marca error de compilación. Explica porqué. El programa del ejemplo 3 también se puede reducir empleando exclusivamente el método main con la cláusula throws. Finalmente el programa queda como se presenta a continuación: import java.io.*; public class LeerUnaCadena{ public static void main(String args[]) throws IOException{ // Definir un flujo de caracteres de entrada: flujoE InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); // Variable para almacenar una línea de texto String sdato; System.out.print("Introduzca un texto: "); sdato = br.readLine(); // leer una línea de texto // Escribir la línea leída System.out.println("La cadena leida es: "+sdato); } } Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (MANEJO DE EXCEPCIONES) Ejercicios Propuestos 1. El siguiente código: public class Division{ public static void main(String args[]){ int x,y,z; x=2; y=0; z=x/y; System.out.println("El resultado es: "+z); } } genera una excepción al ejecutarse.¿Qué excepción se genera? ¿Por qué? Modifique el código utilizando try-catch, para que despliegue en pantalla la razón de la excepción. Además, haga que el programa reciba parámetros desde la línea de comandos. 2. Investigue con qué tipo de datos se genera la excepción del ejercicio anterior. Utilizando el código original del ejercicio anterior, si se cambia el tipo de dato, por ejemplo a double, ¿qué sucede? 3. El siguiente código: public class Arreglo{ public static void main(String args[]){ int n = Integer.parseInt(args[0]); int arr[] = new int[n]; for(int i=0;i<n;i++){ arr[i]=i+1; } for(int i=0;i<n;i++){ System.out.println("arr["+i+"]: "+arr[i]); } } } genera una excepción al ejecutarse.¿Qué excepción se genera?, ¿por qué? Modifique el código utilizando try-catch, para que despliegue en pantalla la razón de la excepción. (OSURIHVRUSRGUiGLVHxDUVXVSURSLRVHMHUFLFLRVVLHPSUH\FXDQGRFXEUDSRUFRPSOHWRHOREMHWLYRGH ODSUiFWLFD Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos