Metodología de Programación Ayudantía 4 lelagos.ublog.cl 2009 Excepciones • Las excepciones en Java están destinadas, al igual que en el resto de los lenguajes que las soportan, para la detección y corrección de errores. Si hay un error, la aplicación no debería morirse. Se debería lanzar (throw) una excepción que nosotros deberíamos capturar (catch) y resolver la situación de error. Utilizadas en forma adecuada, las excepciones aumentan en gran medida la robustez de las aplicaciones. • El levantar una excepción provoca que el método termine inmediatamente. • Sin embargo, el enunciado throw no devuelve un resultado ni la ejecución continua desde donde la invocación ocurrió. En vez de esto, la excepción hace que el metodo o calculos que se esta efectuando termine inmediatamente. Excepciones • Blockes (try / Catch / Finally) Para el manejo correcto de una excepción utilizaremos los blockes Try Catch. Entre las llaves de try (Intentar) escribiremos el código que hará funcional nuestro programa. try { //declaración que causa la excepción } • Para capturar la excepción que puede generar este código necesitaremos otra instrucción llamada catch (Capturar). Excepciones - Blockes (try / Catch / Finally) catch(NombredeExcepcion obj) { //código para tratar el error } • Entre las llaves de catch escribiremos el código que queramos para tratar el error. Excepciones - • Blockes (try / Catch / Finally) Para los Bloques try/catch existe una variación que consiste en agregar una sección denominada finally, dicha estructura estaría compuesta de la siguiente manera: try { // Código que pueda generar Errores ("Exception's") } catch(Tipo1 id1) { // Manejar "Exception's" para la Clase Tipo1 } finally{ // Actividades que siempre ocurren } Excepciones - Blockes (try / Catch / Finally) • La utilización de finally es empleada dentro de un Bloque try/catch para realizar tareas que deben ser ejecutadas independientemente del comportamiento de errores. • Cuando se atrapa un error ("Exception") un programa queda inconcluso, es esta terminación abrupta la que puede causar que algún recurso/mecanismo permanezca asignado o mal utilizado; a través de una sección finally se garantiza que sea ejecutado un juego de instrucciones independientemente del tipo de error que pueda ocurrir; un uso muy común para una sección finally consiste en liberar conexiones hacia Bases de Datos que pudieran haber sido asignadas en la sección try. Ejemplo • • class StackIsFullException extends Exception { private int elem; public StackIsFullException(int elem) { super(); this.elem=elem; } public String toString() { return "Pila llena: no se pudo insertar el elemento " + elem; } • } Ejemplo public void push(int elem) throws StackIsFullException { if (isStackFull()) { throw new Exception(elem); } top++; arreglo[top]=elem; } Ejemplo try { pila.push(10); } catch (StackIsFullException e) { System.out.println(e.toString()); } Finally { System.out.println(“Esto se ejecuta siempre”); } Canales de Entrada en Java • La entrada y salida de datos se realiza en Java con el uso de varias clases definidas en el paquete java.io. • Estas clases permiten realizar operaciones de lectura de datos y escritura de datos en canales de entrada o salida. • Los canales de entrada de datos de texto pueden ser procesados con las llamadas clases Reader, que son clases cuyo objetivo es proveer de métodos de lectura de caracteres (char) desde canales de entrada Canales de Entrada en Java • Imaginar los canales de texto como un lugar desde donde puedo leer caracteres: 'a' 'v' 'i' 'ó' 'n' Se lee de a un char por vez Tipos de Canales de Entrada • Los canales de entrada disponibles son: – Archivos – Arreglos de Char – Strings – Entrada Estándar • Es decir, puedo leer desde cualquiera de esos objetos. Clases Reader • CharArrayReader Permite leer desde un arreglo de char • StringReader Permite leer desde un String • FileReader • Permite leer desde un archivo de texto InputStreamReader Permite leer caracteres desde un canal de bytes Lectura de Entrada Estándar • La entrada estándar es un canal de lectura de bytes, es decir, datos binarios. • Para leer desde teclado se requiere utilizar una clase que convierte estos bytes a char (suponiendo que siempre son caracteres) • Esta clase es InputStreamReader Creando un objeto Reader para Entrada Estándar • Requiero un objeto InputStreamReader, el cual recibe otro objeto… el de la entrada estándar. • La entrada estándar está en System.in y corresponde a un objeto de la clase InputStream (canal de entrada binario) IOException • Todas las operaciones de entrada/salida pueden lanzar la excepción IOException, la cual se recomienda capturar para imprimir un mensaje apropiado al usuario try { // operaciones de I/O } catch (IOEXception e) { System.out.println("Error:"+e); } try { // Creo un InputStreamReader para leer desde la entrad estándar (InputStream) InputStreamReader lector; lector = new InputStreamReader(System.in); // Con buffer para leer de a líneas BufferedReader lectorBuffer; lectorBuffer = new BufferedReader(lector); // Leo un texto desde teclado System.out.println("Ingrese su nombre:"); String texto = lectorBuffer.readLine(); System.out.println("Su nombre es "+texto); } catch (IOException ex) { Logger.getLogger(testmain.class.getName()).log(Level.SEVERE, null, ex); }