Java: control de excepciones



Documentos relacionados
Java: control de excepciones

Uso de excepciones en Java

Java: Clases Abstractas e Interfaces

Programación Orientada a Objetos. Java: Excepciones

Excepciones. Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial. Excepciones

Programación Orientada a Objetos. Java: Excepciones

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Tema 14: Excepciones

Modelo de Objetos Distribuidos

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

Introducción - por qué usarlas?(1)

Modulo 1 El lenguaje Java

EXCEPCIONES EN JAVA. Las sentencias que tratan las excepciones son try y catch. La sintaxis es:

SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler

Repaso de las características más importantes de la programación Java y su adaptación a Android

Preliminares. Tipos de variables y Expresiones

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

1. Manejo de memoria estática 2. Manejo de memoria dinámica

15. Parámetros o argumentos

Sintaxis y Convenciones de Java. M. en C. Erika Vilches

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Pruebas de unidad con JUnit

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Tema 1. Introducción a JAVA

HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA

Programación Orientada a Objetos con Java

Sensor de Temperatura utilizando el Starter Kit Javelin Stamp. Realizado por: Bertha Palomeque A. Rodrigo Barzola J.

Técnicas Avanzadas de Testing Automatizado

Práctica 2: Java Remote Method Invocation (RMI)

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

Capitulo 3. Test Driven Development

1. Visión general de RMI

11. Algunas clases estándar de Java (II)

TEMA 5. EXCEPCIONES EN JAVA DEFINICIÓN DE EXCEPCIONES EN PROGRAMACIÓN TIPOS DE EXCEPCIONES / ERRORES Y CÓMO TRATARLOS

Introduciendo datos desde el

Multitarea en Java. Rafa Caballero - UCM

Práctica sobre compartición de instancias remotas.

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

Excepciones y E/S Java y Servicios Web I Master en Ingeniería Matemática

BPMN básico. Clase Modelos de Procesos. Javier Bermudez

Elementos léxicos del lenguaje de programación Java

Universidad de Cantabria

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Objetivo de aprendizaje del tema

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACION DE COMPUTACIÓN PROYECTO DE CÁTEDRA. MATERIA: Introducción a la Programación

8. Sentencia return y métodos

Definición de clases: Herencia, polimorfismo, ligadura dinámica

SIIGO PYME PLUS. Proceso de Recuperación. Cartilla I

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Acronis License Server. Guía del usuario

Creación de Funciones de Conducción

Introducción a Java LSUB. 15 de enero de 2015 GSYC

Práctica: Creación de un programa C# sencillo

Manual del Protocolo XML-RPC de Mensajería Negocios

Concurrencia en Java

Tema 2. El lenguaje de programación Java (Parte 1)

Introducción... 1 Qué es Java?... 1 Compilando a Bytecode... 1 Usando jgrasp Para Hacer el Trabajo Sucio... 5 El Entorno de jgrasp...

Benemérita Universidad Autónoma del Estado de Puebla

Benemérita Universidad Autónoma del Estado de Puebla

1 HILOS (THREADS) EN JAVA

Facultad de Ingeniería Escuela de Ingeniería de Sistemas y Computación Algoritmia y Programación

Examen de Prácticas de Programación Ingeniería Informática

2. Estructura de un programa en Java

Un breve resumen del lenguaje Java

Práctica 3 mtp. metodoloxía e tecnoloxía da programación. Presentar detalles básicos sobre la sintaxis del lenguaje de programación Java.

FACULTAD DE INGENIERÍA

Programación en Java. Programación en OO

Estructuras de Sistemas Operativos

Programación Orientada a Objetos en JAVA

Primer Parcial Septiembre 5 de 2009

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación

Java en 2 horas. Rodrigo Santamaría

Remote Method Invocation (RMI) de Java

MANTENIMIENTO Y SOPORTE

Patrones para persistencia (I) Ingeniería del Software II

UNIVERSIDAD DE SEVILLA PRÁCTICAS DE LABORATORIO ANÁLISIS SINTÁCTICO (1) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007

Introducción a la Programación en Java

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

Introducción a la Firma Electrónica en MIDAS

Programación Orientada a Objetos en Java

Programación Orientada a Objetos en Java

Primer Parcial de Programación 3 (1/10/2009)

Taller de Programación Estructurada en Java Tema 2. Fundamentos de la programación orientada a objetos

Primera Escuela de la Red Temática SVO. Madrid, Noviembre, 2006 JAVA BÁSICO. Raúl Gutiérrez Sánchez LAEFF - INTA raul@laeff.inta.

Parte I: Programación en un lenguaje orientado a objetos

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

1. Qué tipos de relación hay entre las siguientes clases?

Tema: Clases y Objetos en C++.

1. Creación del repositorio

Llamada a métodos remotos (RMI). Curso 04/05. Tema 9. Departament d Informàtica. Universitat de València. 1. Introducción 2

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Objetos y Clases en Java. ELO 329: Diseño y Programación Orientados a Objetos

Gestor de aplicaciones Java. Esta herramienta es el intérprete de los archivos de clase generados por el javac (compilador).

Arquitectura Cliente/Servidor. Invocación de Métodos Remotos RMI: Remote Method Invocation. Llamadas a Métodos Remotos

Introducción al lenguaje Java

Transcripción:

Introducción Java: control de excepciones Una excepción es un evento que ocurre durante la ejecución de un programa, y que interrumpe su flujo de control normal. Normalmente se encuentran asociadas a errores. Los errores pueden tener distintos orígenes: falla del disco duro, problemas en la red, problemas de programación (ej. división por cero), etc. Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile fguidi@ucv.cl Actualización: 07 de marzo de 2007 2 Detección de errores Ejemplo 1 Cuando ocurre un error durante la ejecución de un método en Java se genera un objeto excepción que es enviado al ambiente de ejecución. El flujo de control normal del programa es interrumpido. El objeto excepción contiene información relativa al error, incluyendo el tipo del mismo y el estado del programa al momento de haberse producido. Cuando se genera el objeto excepción, el ambiente de ejecución busca en el stack de llamadas a métodos alguno que sea capaz de manejar la excepción (exception handler). Si no lo encuentra, la JVM se hace cargo de él, y el programa termina con un mensaje de error. Stack métodos Excepción método n método 2 método 1 JVM Un caso de división por cero: public class Par { int x, y; public Par(int x, int y ){ this.x = x; this.y = y; public int divide() { public class Division{ public static void main(string[] arg) { Par par = new Par( 100, 0 ); par.divide(); System.out.println( Fin programa ); Clase Par, recibe dos números enteros y permite obtener el cuociente entre ellos El objeto de la clase Par realizará una división por cero 3 4

Ejemplo 1: Stack de llamadas a métodos Ejecución del ejemplo 1 El método main invoca al método divide del objeto de la clase Par. Durante la ejecución del método divide se genera una excepción. divide main Java Virtual Machine par.divide(); (y = 0) Clase de excepción: java.lang.arithmeticexception Información: / by zero (división por cero) Stack de llamadas de métodos: 1. Método divide de la clase Par (archivo Par.java, línea 11) llamado por 2. Método main de la clase Division (archivo Division.java, línea 6) 5 6 La jerarquía de excepciones Opciones en el control de excepciones Object Throwable Frente a un determinado tipo de excepción un método puede: Lanzar la excepción fuera de él, para traspasar al método invocante la responsabilidad de tratar la excepción; o en caso de ser el primer método del stack de llamadas, traspasar la responsabilidad a la JVM. Capturar la excepción, y proveer un flujo de control alternativo. Error Exception Excepción RuntimeException Stack métodos divide main JVM 7 8

Control de excepciones: lanzamiento de una excepción Para indicar que un método traspasará la responsabilidad del control de excepciones al método llamante, se debe usar la cláusula throws en la declaración del método, seguida por el nombre de la excepción: Ejemplo: Nombre excepción public boolean startplaying() throws SoundException { Control de excepciones: lanzamiento de una excepción (cont.) Un ejemplo clásico: lectura de datos de la consola import java.io.* ; public class Factorial { public static void main( String arg[ ] ) throws IOException { int número=0, i=1, fact=1; BufferedReader lector = new BufferedReader( new InputStreamReader( System.in ) ); String ingresado=null; System.out.println( "Ingrese número para cálculo de factorial: " ); ingresado = lector.readline( ); número = Integer.parseInt( ingresado ); while( i <= número ) { fact = fact * i; i++; System.out.println( "El factorial de " + número + " es " + fact ); // Fin método main // Fin clase 9 10 Control de excepciones: captura de una excepción Control de excepciones: captura de una excepción (cont.) Las excepciones pueden ser capturadas y manejadas usando bloques try, catch y finally (operan en conjunto) El bloque try debe incluir las instrucciones que pueden generar la excepción que se desea manejar. Debe ser seguido por al menos un bloque catch o un bloque finally. El bloque catch debe seguir al bloque try, y debe contener las instrucciones que serán ejecutadas en caso de generarse una excepción. El bloque finally incluye las instrucciones que deberán ejecutarse independientemente de la generación (o ausencia) de una excepción (normalmente usados para liberar recursos). Formato general: El tipo de excepción (Tipo_Excepción1, Tipo_Excepción2, etc.) representa la clase de excepción que se puede generar en el bloque try que interesa capturar y controlar. Al producirse una excepción sólo uno de los bloques catch será ejecutado El orden de los catch es importante: las subclases de excepciones deben ser especificadas antes de sus superclases try { // instrucciones que pueden fallar catch (Tipo_excepción1 nombre_variable){ // instrucciones a ejecutar si se produce // una excepción tipo 1 catch (Tipo_excepción2 nombre_variable){ // instrucciones a ejecutar si se produce // una excepción tipo 2 catch (Tipo_excepciónN nombre_variable){ // instrucciones a ejecutar si se produce // una excepción tipo N finally{ // instrucciones a ejecutar siempre 11 12

Control de excepciones: captura de una excepción (cont.) (Nuevamente) el ejemplo clásico: import java.io.* ; public class Factorial { public static void main( String arg[ ] ){ int número=0, i=1, fact=1; BufferedReader lector = new BufferedReader( new InputStreamReader( System.in ) ); String ingresado=null; System.out.println( "Ingrese número para cálculo de factorial: " ); try { ingresado = lector.readline( ); número = Integer.parseInt( ingresado ); while( i <= número ) { fact = fact * i; i++; System.out.println( "El factorial de " + número + " es " + fact ); catch( IOException e ) { System.out.println( "Error de input." ); // Fin método main // Fin clase 13 Ejemplo 2: captura de una excepción public class Par { int x, y; public Par(int x, int y ){ this.x = x; this.y = y; public int divide() { try{ catch(arithmeticexception e){ return 999999999; public class Division{ public static void main(string[] arg) { Par par = new Par( 100, 0 ); int res = par.divide(); System.out.println( "El cuociente es: " + res ); En este caso la excepción es interceptada en el método divide Nota: en el ejemplo es discutible la decisión de retornar esta constante en caso de error en la división 14 Ejecución del ejemplo 2 A pesar del error el programa completa su ejecución normalmente: Información relacionada con la excepción Toda instancia de excepción tiene un método printstacktrace, que imprime el stack de llamadas de métodos al momento de generarse. Este método puede ser utilizado para proporcionar información relacionada con la excepción dentro del bloque catch correspondiente: Qué ocurre? La excepción se produce en el método divide() de la clase Par, dentro del bloque try. Esta excepción es capturada en el bloque catch, y el código escrito en este último es ejecutado. try { // instrucciones que pueden fallar catch (Tipo_excepción nombre_variable){ nombre_variable.printstacktrace(); 15 16

Ejemplo 3: impresión de la información asociada a la excepción Ejecución del ejemplo 3 1 public class Par { 2 int x, y; 3 public Par(int x, int y ){ 4 this.x = x; 5 this.y = y; 6 7 public int divide() { 8 try{ 9 10 catch(arithmeticexception e){ 11 e.printstacktrace(); 12 return 999999999; 13 14 15 El objeto excepción es referenciado al interior del bloque catch por medio de la variable e Se invoca el método printstacktrace sobre el objeto excepción El programa ahora indica el tipo de excepción y lugar donde ésta se produjo: 1 public class Division{ 2 public static void main(string[] arg) { 3 Par par = new Par( 100, 0 ); 4 int res = par.divide(); 5 System.out.println( "El cuociente es: " + res ); 6 7 Notar que el programa termina su ejecución normalmente. 17 18 La clase RuntimeException Representa excepciones comunes que se presentan en la JVM durante la ejecución de programas. Ejemplo: NullPointerException. La clase RuntimeException (cont.) Ejemplo: ArithmeticException es subclase de RuntimeException. Por tanto las siguientes implementaciones de la clase Par son equivalentes: Debido a la ubicuidad de este tipo de excepciones, el compilador permite no especificar el mecanismo de control de las RuntimeExceptions: cuando este mecanismo no es especificado, estas excepciones serán lanzadas fuera del método actual. RuntimeException public class Par { int x, y; public Par(int x, int y ){ this.x = x; this.y = y; public int divide() throws ArithmeticException { public class Par { int x, y; public Par(int x, int y ){ this.x = x; this.y = y; public int divide() { NullPointerException 19 20

Crear nuevas excepciones Se pueden crear nuevas excepciones extendiendo la clase Exception o una de sus subclases. La clase Exception ofrece distintos constructores que pueden ser referenciados desde las subclases. Los más utilizados son: public Exception(): inicializa la excepción con valores de default (mensaje nulo) public Exception(String mensaje): inicializa la excepción con el mensaje recibido como parámetro. Nota: la clase RuntimeException también puede ser extendida. Crear nuevas excepciones (cont.) Ejemplo: public class UnsupportedMediaException extends Exception{ public UnsupportedMediaException(){ super( The selected media is not supported. ); Convención: el nombre de las excepciones termina en la palabra Exception 21 22 Lanzamiento de una excepción Una excepción puede ser lanzada en cualquier parte del código usando la instrucción throw acompañada de la referencia a un objeto excepción: throw new NombreExcepción( parámetros_constructor ) Ejemplo: public void savedata throws UnsupportedMediaException{ if(!iscompatible( requestedmedia ) ) throw new UnsupportedMediaException(); 23 Ejemplo 4: creación y lanzamiento de excepciones public class Test{ public static void main(string[] arg) throws UnsupportedMediaException { Recorder r = new Recorder( "CD" ); r.saveon( "DVD" ); System.out.println( "Saved." ); public class Recorder { String media; public Recorder( String mediatype ){ media = mediatype; public void saveon( String mediatype ) throws UnsupportedMediaException{ if( media.equals( mediatype ) ) System.out.println( "Saving." ); else throw new UnsupportedMediaException(); public class UnsupportedMediaException extends Exception { public UnsupportedMediaException() { super( "The selected media is not supported" ); 24

Ejecución del ejemplo 4 La excepción definida se comporta como cualquier otra excepción: Ejercicio Se pide crear la clase Temperature, para registrar temperaturas en grados Celsius (ºC) y Kelvin (ºK). Una instancia de la clase deberá almacenará un valor de temperatura y lo retornará en cualquiera de las escalas. Para ello la clase deberá ofrecer los métodos setc y setk para establecer valores en ºC y ºK, y los métodos getc y getk para retornar los valores en ºC y ºK, respectivamente. Notar que no es físicamente posible admitir temperaturas inferiores a los 0ºK, por lo tanto será necesario generar una excepción (IllegalTemperatureException) cuando un valor fuera de rango trate de ser ingresado. Genere las clases indicadas, y una aplicación que permita ingresar valores y visualizarlos. 25 26 Discusión Excepciones: caso del Ariane 5 Considere los siguientes ejemplos: Una clase CuentaCorriente (que maneja una cuenta bancaria) no debe admitir giros mayores que el saldo disponible. En caso de ser inadmisible el giro, éste podría ser impedido: Retornado false en el método que efectúa el giro. Generando una excepción en el método que efectúa el giro. En la clase Temperature del ejemplo anterior se genera una excepción cuando se trata de establecer una temperatura inválida. Alternativamente se podría haber obviado la creación de la excepción, y haber retornado falso en los métodos setk y setc. Vuelo 501, 4 de Junio de 1996, autodestrucción en H0 +39 : Cuándo conviene generar excepciones? Costo: 500 millones de dólares 27 28

Excepciones: caso del Ariane 5 (cont.) Sistema de control de vuelo: Plataforma de referencia inercial Lecturas de giroscopios y acelerómetros SRI-1 OBC-1 SRI-2 Bus de datos OBC-2 Servo-válvulas y actuadores hidráulicos MOTORES SRI: Inertial Reference System OBC: On-Board Computer Excepciones: caso del Ariane 5 (cont.) Reporte del equipo de investigación sobre la falla del vuelo 501: Aproximadamente en el instante H0 +39 segundos, el Ariane 5 comenzó a desintegrarse debido a esfuerzos aerodinámicos excesivos ocasionados por un ángulo de ataque inapropiado. Esto condujo a la separación de los propulsores auxiliares respecto del cuerpo principal de la nave, por lo que se gatilló el mecanismo de autodestrucción del cohete. Este ángulo de ataque resultó ser consecuencia de una completa desalineación entre las toberas de los propulsores auxiliares y aquella del motor principal. La desalineación de las toberas fue comandada por el OBC a partir de información transmitida por el SRI-2. Parte de estos datos no contenían información de vuelo, sino un patrón de diagnóstico del SRI, el cual fue interpretado como información de vuelo. La razón por la cual el SRI-2 no envió datos reales es que la unidad se había declarado en falla por una excepción de software. 29 30 Excepciones: caso del Ariane 5 (cont.) El OBC no pudo acceder al SRI-1 porque este se había desactivado algunos milisegundos antes por la misma razón que el SRI-2. La excepción interna en el software del SRI fue ocasionada durante la ejecución de una instrucción de conversión de un valor en formato punto flotante de 64 bits a entero con signo de 16 bits, en circunstancias que el valor excedía la capacidad del tipo entero. La operación de conversión no estaba protegida, aún cuando asignaciones de variables similares sí lo estaban. El valor que se intentó convertir correspondía a la magnitud de la variable HB (desviación horizontal), significativa sólo durante la fase de alineación previa al despegue. Sin embargo, esta función de cálculo se mantuvo operativa durante 40 segundos tras el despegue por un requerimiento en el diseño del Ariane 4, no presente en el Ariane 5 (el diseño del SRI de ambas naves era en práctica idéntico). La conversión del valor de la variable HB no estaba protegida porque el Ariane 4 realizaba una trayectoria inicial distinta a la del Ariane 5, en la cual dicha variable nunca tomaría valores fuera del rango esperado. 31 Excepciones: caso del Ariane 5 (cont.) Comentarios: La operación inválida generaba correctamente una excepción. Sin embargo, el mecanismo de gestión de excepciones no fue diseñado para responder adecuadamente. El mecanismo de tolerancia a fallas del Ariane 5 estaba concebido para tratar fallas aleatorias (por ej. malfuncionamiento del hardware de uno de los computadores), no errores de diseño (ambas SRI experimentaron el mismo comportamiento al momento de producirse la falla). El equipo de investigación sobre el accidente sugirió cambiar el enfoque de desarrollo utilizado hasta entonces, el software se considera correcto hasta que se demuestra que falla, por el enfoque se asume que el software es defectuoso hasta que, tras aplicar métodos aceptados como buenas prácticas, se logre demostrar que está correcto. 32