CAPÍTULO 4: EXCEPCIONES EN JAVA

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

Presentación. Programación I. Programación Orientada a Objetos. :: Prof. Yeniffer Peña

Formato para prácticas de laboratorio

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Tema 4. Excepciones en Java

Excepciones en Programación Orientada a Objetos

Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Excepciones. Excepciones

7. Otras sentencias Sentencia break. 84 A. García-Beltrán y J.M. Arranz

TEMA 8. Excepciones en Java. Curso de Java. 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.

TEMA 8. Agenda. Excepciones

Uso de excepciones en Java

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA

Resumen Manejo de Excepciones

Manejo de Excepciones

Si bien hay gran cantidad de excepciones, todas derivan de la clase Exception, además de las excepciones ya manejadas, se pueden crear propias.

Java: control de excepciones

UD 4 GESTIÓN DE ERRORES. Pedro J. Ponce de León. Versión

Reconociendo tipos de excepciones comunes

Módulo 11: MANEJO DE EXCEPCIONES 11-1

fundamentos de programación (unidad 7) herencia y relaciones entre clases

Excepciones e hilos. Acceso a la red - Ejercicios

Práctica #5: Uso de control de flujo, Excepciones y Lectura Estándar

Tema 14: Excepciones

Programación Orientada a Objetos. Java: Excepciones

Programación Orientada a Objetos. Java: Excepciones

Ejercicios de tratamiento de errores

Programación Orientada a Objetos en C#.NET CAPÍTULO 8 EXCEPCIONES. Ing. Bruno López Takeyas, M.C.

Introducción a Java. Introducción a Java. Programación I

Tema 5 Corrección y Robustez Excepciones en Java

1. Cuántas sentencias hay en la secuencia principal del siguiente programa?

INF 473 Desarrollo de Aplicaciones en Java

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

PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:

JAVA 1. Introducción

Manejo de excepciones en Java. ELO329: Diseño y Programación Orientados a Objetos Agustín J. González

TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote MODIFICADORES DE ACCESO A LOS MIEMBROS DE UNA CLASE

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

Manejo de errores: Excepciones en Java. ELO329: Diseño y Programación Orientados a Objetos

JAVA: Excepciones. Errores

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

Tema 4: Corrección y Robustez en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

MANEJO DE EXCEPCIONES en C++ Dr. Oldemar Rodríguez R. Escuela de Informática Universidad Nacional

a) Reescribir P1 introduciendo un error sintáctico (de compilación), otro de ejecución, y

Excepciones LSUB, GSYC, URJC. Monday, February 4, 13

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

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

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

Tema 15: Aserciones 0

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

Java: control de excepciones

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Manejo de Excepciones Para capturar y manejar las excepciones Java proporciona la sentencia try, catch y finalty. Entre un try y un catch se escribe

Introducción a Java 10/02/2011. Tokens. Juan Manuel Fernández Peña Curso Rev Tokens. Tokens

INTRODUCCION A LA PROGRAMACION EN JAVA

Por el contrario System.in es un byte Stream sin caracteristicas de character Stream.

5. Sentencias selectivas o condicionales

En Java, un arreglo es un grupo de variables (llamados elementos o componentes) que contienen valores, todos del mismo tipo.

Diseño Basado en Componentes Curso 2008 / 09

Java. Introducción a la Programación Orientada a Objetos

Guía - Taller # 2 (JAVA)

Metodología y Tecnología de la Programación

Construcciones del Lenguaje Java

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Flujos (streams) Programación. Licenciatura Lingüística y Nuevas Tecnologias Nadjet Bouayad-Agha

Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.

Práctica #4: Uso de control de flujo

HERENCIA. Problema: Reparar el el coche. Jesús (Valencia) Luis, Mecánico (Valencia) Antonio, Servicio Técnico Ferrari (Madrid)

MASTER EN MODELIZACIÓN MATEMÁTICA, ESTADÍSTICA Y COMPUTACIÓN Curso: Bases de datos y programación orientada a objetos Parte POO

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

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Elementos léxicos del lenguaje de programación Java

Código Fuente. Creamos en C:\ una carpeta para ubicar el código fuente del servidor. En mi caso, he creado una carpeta denominada rmi4

Un breve resumen del lenguaje Java

Manejo de Excepciones

Curso Informática Lección 6. Métodos de objetos y clases

Estructuras de control selectivas

4. Operadores Operador asignación

k. Son métodos de la clases y respectivamente, que analiza un para devolver un entero con

Tecnología de Programación

Depto. Ingeniería de Sistemas Telemáticos Universidad Politécnica de Madrid ETSI Telecomunicación Fundamentos de Programación 15 de diciembre de 2011

18. Interfaces Declaración de una interfaz

Introduciendo datos desde el

Unidad VI. archivos de texto llano o texto simple por carecer de información destinada a generar formatos y tipos de letra.

James Gosling, creador de Java

Diseño y Programación Orientados a Objetos 29 de Abril de Primer Certamen

Programación Estructurada

TEMA 1. Introducción a la programación. CONSIDERACIONES GENERALES.

Estructura de datos y Programación

Tema 2: EL TIPO DE DATOS ENTERO. INSTRUCCIÓN DE ASIGNACIÓN Y DE COMPOSICIÓN SECUENCIAL

6. Sentencias repetitivas o bucles

Introducción a Java LSUB. 30 de enero de 2013 GSYC

CLAVE EXAMEN: a cd. c u r s o r = c u r s o r. g e t S i g u i e n t e ( ) ; p o s i c i o n ++;

Tema 2: Errores y Excepciones: Modelo y Gestión. Modelización Java de la Jerarquía de

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

Tema 4: Control del flujo de ejecución: Excepciones y Threads. Programación Orientada a Objetos. Marcos López Sanz

Transcripción:

PROGRAMACIÓN ORIENTADA A OBJETOS CON JAVA CAPÍTULO 4: EXCEPCIONES EN JAVA 1

CONTENIDOS TEMA 4: Excepciones en Java. 4.1 INTRODUCCIÓN 4.2 MANEJO DE EXCEPCIONES EN JAVA 4.3 TIPOS DE EXCEPCIONES 4.3.1 Excepciones predefinidas 4.3.2 Excepciones definidas por el usuario 4.4 PROPAGACIÓN DE EXCEPCIONES 2

INTRODUCCIÓN Cuando sucede un evento anormal en la ejecución de un programa y lo detiene decimos que se ha producido una excepción. Cualquier programa bien escrito debe ser capaz de tratar las posibles excepciones que pueden ocurrir en su ejecución de manera inteligente y de recuperarse, si es posible, de ellos. Con los mecanismos de recuperación ante excepciones construimos programas robustos y con capacidad de recuperación ante errores más o menos previsibles que se pueden producir en el momento en que se ejecuta el programa. En Java una excepción es un objeto que avisa que ha ocurrido alguna condición inusual. Existen muchos objetos de excepción predefinidos, y también podremos crear los nuestros propios. Cuando se capturan excepciones en Java las sentencias que pueden causar un error se deben insertar en un bloque formado por try y catch, a continuación, en catch debemos tratar esos posibles errores. También existe la posibilidad de lanzar una excepción cuando se produzca una determinada situación en la ejecución del programa, para hacerlo utilizaremos la instrucción throw. 3

MANEJO DE EXCEPCIONES // Ejemplo excepción sin tratar public class EjExcepcion public static void main (String args[]) int i = 0; String cadenas[] = "Cadena 1", "Cadena 2", "Cadena 3", "Cadena 4" ; for (i=0; i<=4; i++) System.out.println(cadenas[i]); Como resultado de la ejecución del programa obtendremos: > java EjExcepcion Cadena 1 Cadena 2 Cadena 3 Cadena 4 java.lang.arrayindexoutofboundsexception at EjExcepcion.main(EjExcepcion.java, Compiled Code) Exception in thread "main" Process Exit... 4

MANEJO DE EXCEPCIONES Vamos a reescribir el programa anterior para tratar el error: // Ejemplo de tratamiento de excepciones public class EjExcepcionBien public static void main (String args[]) int i = 0; String cadenas[] = "Cadena 1", "Cadena 2", "Cadena 3", "Cadena 4" ; try for (i=0; i<=4; i++) System.out.println(cadenas[i]); catch( ArrayIndexOutOfBoundsException ae ) System.out.println("\nError: Fuera del índice del array\n"); catch( Exception e ) // Captura cualquier otra excepción System.out.println( e.tostring() ); finally System.out.println( "Esto se imprime siempre." ); Como resultado de la ejecución del programa obtendremos: > java EjExcepcionBien Cadena 1 Cadena 2 Cadena 3 Cadena 4 Error: Fuera del índice del array Esto se imprime siempre. 5

MANEJO DE EXCEPCIONES Vamos a modificar un poco el programa para que se produzca otro tipo de excepción, en este caso una división por cero y se ejecute el bloque del segundo catch: // Ejemplo de tratamiento de excepciones 2 public class EjExcepcionBien public static void main (String args[]) int i, valor = 0; String cadenas[] = "Cadena 1", "Cadena 2", "Cadena 3", "Cadena 4" ; try for (i=0; i<=4; i++) System.out.println(cadenas[i]); valor = i/0; catch( ArrayIndexOutOfBoundsException ae ) System.out.println("\nError: Fuera del índice del array\n"); catch( Exception e ) // Captura cualquier otra excepción System.out.println( e.tostring() ); finally System.out.println( "Esto se imprime siempre." ); 6

MANEJO DE EXCEPCIONES Como resultado de la ejecución del programa obtendremos: > java EjExcepcionBien Cadena 1 java.lang.arithmeticexception: / by zero Esto se imprime siempre. En este caso el programa ha ejecutado: catch( Exception e ) // Captura cualquier otra excepción System.out.println( e.tostring() ); que funciona como un mecanismo general de captura de excepciones, es decir, cualquier excepción no tratada anteriormente es tratada aquí. 7

try MANEJO DE EXCEPCIONES - try Define un bloque de código donde se puede generar una excepción. El bloque try va seguido inmediatamente de uno o más bloques catch y opcionalmente de una cláusula finally. Cuando se lanza una excepción el control sale del bloque try actual y pasa a un manejador catch apropiado. La sintaxis general del bloque try consiste en la palabra clave try y una o más sentencias entre llaves. try // Sentencias Java Se pueden presentar dos situaciones diferentes a la hora de definir el bloque try: Podemos tener más de una sentencia que generen excepciones, en cuyo caso podemos definir bloques individuales para tratarlos. Podemos tener agrupadas en un mismo bloque try varias sentencias que puedan lanzar excepciones, con lo que habría que asociar múltiples controladores a ese bloque. Será la decisión del programador utilizar una forma u otra de controlar las excepciones. 8

catch MANEJO DE EXCEPCIONES - catch Define el bloque de sentencias que se ejecutarán cuando se haya producido una excepción en un bloque try. La sintaxis general de la sentencia catch en Java es la siguiente: catch( TipoExcepcion nombrevariable ) // sentencias Java Se pueden colocar sentencias catch sucesivas, cada una controlando una excepción diferente. No debería intentarse capturar todas las excepciones con una sola cláusula ya que representa un uso demasiado general y podrían llegar muchas excepciones. catch( Exception e ) //captura genérica 9

MANEJO DE EXCEPCIONES - finally finally El bloque de código definido en finally se ejecuta siempre, haya o no excepción. public class EjExcepcionFinally public static void main (String args[]) String cadenas[] = "Cadena 1","Cadena 2","Cadena 3","Cadena 4"; try for (int i=0; i<=3; i++) //Correcto System.out.println(cadenas[i]); catch( ArrayIndexOutOfBoundsException ae ) System.out.println("\nError: Fuera del índice del array\n"); catch( Exception e ) // Captura cualquier otra excepción System.out.println( e.tostring() ); finally System.out.println( "Esto se imprime siempre." ); 10

MANEJO DE EXCEPCIONES - throw throw La sentencia throw se ejecuta para indicar que ha ocurrido una excepción, o lanzamiento de una excepción. La sentencia throw especifica el objeto que se lanzará. La forma general de la sentencia throw es: throw ObjetoThrowable; El flujo de la ejecución se detiene inmediatamente después de la sentencia throw, y nunca se llega a la sentencia siguiente, ya que el control sale del bloque try y pasa a un manejador catch cuyo tipo coincide con el del objeto. Si se encuentra, el control se transfiere a esa sentencia. Si no, se inspeccionan los siguientes bloques hasta que el gestor de excepciones más externo detiene el programa. 11

MANEJO DE EXCEPCIONES - throw // Ejemplo de tratamiento de excepciones con throw import java.io.*; public class ExcepcionThrow public static void main (String args[]) double op1, op2, resd; BufferedReader entrada=new BufferedReader(new InputStreamReader(System.in)); //bucle infinito aunque se produzca una excepción while (true) try System.out.println("\n######## Nueva División ########"); System.out.print("\nNumerador: "); op1 = Double.parseDouble(entrada.readLine()); System.out.print("\nDenominador: "); op2 = Double.parseDouble(entrada.readLine()); if (op2 == 0) throw new ArithmeticException(); resd = op1 / op2; System.out.println( "\nresultado: " + Double.toString(resd) ); catch ( ArithmeticException ae ) System.out.println("\nError aritmético: " + ae.tostring()); catch( NumberFormatException nfe ) System.out.println("\nError de formato numérico: " + nfe.tostring()); catch( IOException ioe ) System.out.println( "\nerror de entrada/salida: " + ioe.tostring() ); catch( Exception e ) // Captura cualquier otra excepción System.out.println( e.tostring() ); 12

MANEJO DE EXCEPCIONES - throws throws Con throws un método lista las excepciones que puede lanzar, y que no va a manejar. Esto sirve para que todos los métodos que lo llamen puedan colocar protecciones frente a esas excepciones. Para la mayoría de las subclases de la clase Exception, el compilador Java obliga a declarar qué tipos de excepciones podrá lanzar un método. Si un método lanza explícitamente una instancia de Exception o de sus subclases, se debe declarar su tipo con la sentencia throws. La declaración del método sigue ahora la sintaxis siguiente: tipo nombremetodo( argumentos ) throws excepciones 13

MANEJO DE EXCEPCIONES - throws // Ejemplo de tratamiento de excepciones con throws import java.io.*; public class ExcepcionThrows public static void main (String args[]) double op1, op2, resd; //bucle infinito aunque se produzca una excepción while (true) try System.out.println("\n######## Nueva División ########"); System.out.print("\nNumerador: "); op1 = capturanum(); System.out.print("\nDenominador: "); op2 = capturanum(); if (op2 == 0) throw new ArithmeticException(); resd = op1 / op2; System.out.println( "\nresultado: " + Double.toString(resd) ); catch ( ArithmeticException ae ) System.out.println("\nError aritmético: " + ae.tostring()); catch( NumberFormatException nfe ) System.out.println("\nError de formato numérico: " + nfe.tostring()); catch( IOException ioe ) System.out.println( "\nerror de entrada/salida: " + ioe.tostring() ); catch( Exception e ) // Captura cualquier otra excepción System.out.println( e.tostring() ); 14

MANEJO DE EXCEPCIONES - throws public static double capturanum() throws NumberFormatException, IOException BufferedReader entrada= new BufferedReader(new InputStreamReader(System.in)); String txt = entrada.readline(); double num = Double.parseDouble(txt); return num; 15

TIPOS DE EXCEPCIONES En Java las excepciones forman una completa jerarquía de clases, cuya clase base es Throwable. La clase Throwable tiene dos subclases: Error y Exception. Un Error indica que se ha producido un fallo del que no se puede recuperar la ejecución normal del programa, por lo tanto, este tipo de errores no se pueden tratar. Una Exception indicará una condición anormal que puede ser resuelta para evitar la terminación de la ejecución del programa. Hay varias subclases de la clase Exception conocidas como excepciones predefinidas, y una de ellas RuntimeException, a su vez, tiene numerosas subclases. El usuario puede definirse sus propias excepciones, tan solo tendrá que extender la clase Exception y proporcionar la funcionalidad extra que requiera el tratamiento de esa excepción. Todas las excepciones deben llevar un mensaje asociado a ellas al que se puede acceder utilizando el método getmessage(), que presentará un mensaje describiendo el error o la excepción que se ha producido. 16

TIPOS DE EXCEPCIONES EXCEPCIONES PREDEFINIDAS 17

TIPOS DE EXCEPCIONES EXCEPCIONES PREDEFINIDAS Excepciones predefinidas más comunes: ArithmeticException Las excepciones aritméticas son típicamente el resultado de una división por 0: int i = 12 / 0; NullPointerException Se produce cuando se intenta acceder a una variable o método antes de ser definido. ClassCastException El intento de convertir un objeto a otra clase que no es válida. y = (Prueba)x; // donde x no es de tipo Prueba NegativeArraySizeException Puede ocurrir si se intenta definir el tamaño de un array con un número negativo. ArrayIndexOutOfBoundsException Se intenta acceder a un elemento de un array que está fuera de sus límites. NoClassDefFoundException Se referenció una clase que el sistema es incapaz de encontrar. 18

TIPOS DE EXCEPCIONES EXCEPCIONES PREDEFINIDAS El compilador Java obliga al programador a proporcionar el código de manejo o control de algunas de las excepciones predefinidas por el lenguaje. Por ejemplo, el siguiente programa, no compilará porque no se captura la excepción IOException que puede lanzar el método readline() definido de la siguiente forma: public String readline() throws IOException import java.io.*; class ErrorExcepcion public static void main( String args[] ) String cadena; BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Introduce una cadena: "); cadena = entrada.readline(); Al intentar compilar, producirá el siguiente error de compilación: > javac ErrorExcepcion.java ErrorExcepcion.java:9: unreported exception java.io.ioexception; must be caught or declared to be thrown 19

TIPOS DE EXCEPCIONES EXCEPCIONES DEFINIDAS POR EL USUARIO También podemos lanzar nuestras propias excepciones, extendiendo la clase Exception. El siguiente programa hace uso de una excepción definida por el usuario. El programa realiza la media de una serie de notas introducidas por el usuario, cuando este intenta poner una nota inferior a 0 o superior a 10, salta la excepción NotaMal. También se han tenido en cuenta otras posibles excepciones predefinidas como errores de formato numérico, errores de entrada salida, etc. // Notas.java import java.io.*; public class Notas public static void main( String args[] ) double media=0, total=0, notanum=0; int contador=0; String notatxt=""; BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in)); while (! notatxt.equals("z") ) try System.out.print( "\nteclee calificación (0-10), Z para terminar: " ); notatxt = entrada.readline().touppercase(); notanum = Double.valueOf(notatxt).doubleValue(); if (notanum < 0 notanum > 10) throw new NotaMal(); total += notanum; contador = contador + 1; 20

TIPOS DE EXCEPCIONES EXCEPCIONES DEFINIDAS POR EL USUARIO catch (NotaMal nm) System.out.println( "\n" + nm.getmessage() ); catch( NumberFormatException nfe ) if (! notatxt.equals("z") ) System.out.println("\nError de formato numérico: " + nfe.tostring()); catch( IOException ioe ) System.out.println( "\nerror de entrada/salida: " + ioe.tostring() ); catch( Exception e ) // Captura cualquier otra excepción System.out.println( e.tostring() ); if ( contador!= 0 ) media = (double) total / contador; System.out.println( "\nel promedio del grupo es: " + media ); else System.out.println( "\nno se introdujeron calificaciones." ); class NotaMal extends Exception public NotaMal() super( "Excepción definida por el usuario: NOTA INCORRECTA." ); 21

PROPAGACIÓN DE EXCEPCIONES Cuando una excepción no es tratada en el método en donde se produce, se busca en el bloque try..catch del método que hizo la llamada. Si la excepción se propaga de todas formas hasta lo alto de la pila de llamadas sin encontrar un controlador específico para la excepción, entonces la ejecución se detendrá dando un mensaje de error con la excepción no tratada. En el siguiente diagrama se muestra gráficamente cómo se propaga una excepción que se genera en un método, a través de la pila de llamadas durante la ejecución de un programa: 22

PROPAGACIÓN DE EXCEPCIONES // PropExcepciones.java public class PropExcepciones public static void main( String args[] ) try metodo1(); catch ( ExcepcionUsuario eu ) System.err.println( "\ncapturada excepción en método1: " + eu.getmessage() + "\n\ntrazado de la pila:\n" ); eu.printstacktrace(); public static void metodo1() throws ExcepcionUsuario metodo2(); public static void metodo2() throws ExcepcionUsuario metodo3(); public static void metodo3() throws ExcepcionUsuario throw new ExcepcionUsuario(); class ExcepcionUsuario extends Exception public ExcepcionUsuario() super( "Excepción definida por el usuario." ); 23

PROPAGACIÓN DE EXCEPCIONES En este programa se hace uso del método printstacktrace(). Invocando a este método sobre una excepción se volcará a pantalla todas las llamadas hasta el momento en donde se generó la excepción. Por ejemplo, la ejecución del programa presentará por pantalla: >java PropExcepciones Capturada excepción en método1: Excepción definida por el usuario. Trazado de la pila: ExcepcionUsuario: Excepción definida por el usuario. at PropExcepciones.metodo3(PropExcepciones.java:29) at PropExcepciones.metodo2(PropExcepciones.java:24) at PropExcepciones.metodo1(PropExcepciones.java:19) at PropExcepciones.main(PropExcepciones.java:7) 24