Download excepciones

Document related concepts
no text concepts found
Transcript
Chapter 8
Excepciones y afirmaciones o
invariantes
(Exceptions and Assertions)
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 1
Objetivos
– Mejorar la confiabilidad del código incorporando
– Escribir métodos para propagar excepciones.
– Implementar los bloques try-catch para atrapar y
manejar las excepciones.
– Escribir clases de excepción programadas.
– Diferenciar las excepciones de tiempo de compilación y
en tiempo de corrida
Definición
• Cdo un programa viola las restricciones semánticas del
lenguaje, se produce un error y la maq virtual comunica
este hecho al programa mediante una excepción.
• Muchas clases de errores pueden provocar una excepción,
desbordamiento de mem, disco estropeado, intento de
dividir por 0, acceder a un vector fuera de los límites.
• Una excepción es un evento que se produce durante la
ejecución de un programa, que interrumpe el flujo normal
de las instrucciones del mismo.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 3
• Se atrapa la excepción si una vez lanzada se interrumpe el
flujo normal de ejecución y se ejecuta la rutina de manejo
de excepciones.
• Cdo se crea una excepción la JVM recorre la pila de
llamadas de métodos en busca de alguno que sea capaz
de tratar la clase de expepción lanzada. Si ninguno de los
mét de la pila pueden la JVM muestra un mensaje de error
y termina el programa.
• El uso de excepciones permite separar el código regular
del manejo de las excepciones, propagar los errores al
método invocante, agrupar los errores por tipo.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 4
Manejo de las excepciones
• Cuando se produce un error dentro de un método, éste crea un
objeto exception
• Este contine la info sobre el error, tipo y el estado del programa
cuando ocurrió.
• Lanzar una excepción es crear un objeto exception, tambien se
puede lanzar explícitamente mediante la instrucción throw
• Despues que el método crea la excepción, el sistema busca si hay
una forma de manejarla.
• La búsqueda se realiza en la pila de llamadas que se realizaron
hasta llegar al método que lanzó la excepción (call stack)
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 5
call stack y búsqueda del manejador
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 6
Ej. Excepciones no capturadas
String inputStr;
int
age;
inputStr = JOptionPane.showInputDialog(null, "Age:");
age
= Integer.parseInt(inputStr);
¿Que ocurre si el usuario ingresa un valor no numérico?
Mensaje de Error ingreso inválido
java.lang.NumberFormatException: ten
at java.lang.Integer.parseInt(Integer.java:405)
at java.lang.Integer.parseInt(Integer.java:454)
at Ch8Sample1.main(Ch8Sample1.java:20)
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 7
Excepción atrapada
inputStr = JOptionPane.showInputDialog(null, "Age:");
try {
age = Integer.parseInt(inputStr);
try
} catch (NumberFormatException e){
//tipo de excepcion que se captura
JOptionPane.showMessageDialog(null, "’" + inputStr
catch
+
"‘ no es válida\n"
+
“ingrese sólo dígitos");
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 8
Flujo de control try-catch
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 9
Obteniendo Información
• Hay dos métodos que podemos llamar para
obtener información sobre una excepción:
– getMessage
– printStackTrace
try {
. . .
} catch (NumberFormatException e){
System.out.println(e.getMessage());
System.out.println(e.printStackTrace());
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 10
Uso de ciclos para ingreso de inf
while (true){
inputStr = JOptionPane.showInputDialog(null, prompt);
try {
age=Integer.parseInt(inputStr);
return age;
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog (null, “ valor ingresado
“ + inputStr + “es enválido /n” + “Sólo ingrese nros”);
}
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 11
Múltiples bloques catch
• Una sentencia try-catch puede incluir varios bloques de
captura, uno para c/ tipo de excepción.
try {
. . .
age = Integer.parseInt(inputStr);
. . .
val = cal.get(id); //cal is a GregorianCalendar
. . .
} catch (NumberFormatException e){
. . .
} catch (ArrayIndexOutOfBoundsException e){
. . .
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 12
Múltiples atrapadores
while (true){
inputStr = JOptionPane.showInputDialog(null, prompt);
try {
age=Integer.parseInt(inputStr);
if (age < 0) {
throw new Exception (“No ingrese valores negativos” );
}
return age;
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog (null, “ valor ingresado “ + inputStr
+ “es inválido /n” + “Sólo ingrese nros”);
}
catch (Exception e){
JOptionPane.showMessageDialog (null, “Error: “ + e.getMessage());
}
©The McGraw-Hill Companies, Inc. Permission
4 Ed Chapter 8 - 13
} for reproduction or display.
required
th
Flujo de control con Múltiples catch
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 14
El Bloque finally
• Hay situaciones en las cuales necesitamos tomar
ciertas acciones sin importar si se produce una
excepción o no.
• Las sentencias que deben ejecutarse siempre se
ponen en el bloque final. Ej liberar recursos, arch,
etc
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 15
Multiples atrapadores
- Se puede crear una excepción usando la sentencia throw
sintaxis : throw < objeto >
dde objet debe se un objeto de la clase Throwable o
subclase de la misma.
- Cdo creamos la instancia de la clase Exception le
pasamos una cadena que describe el error
- La excepción lanzada es atrapada por su correspondiente
catch
- La lista de los atrapadores de excepción deben ir de lo
particular a lo genérico pues sólo se ejecuta el primer
catch
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 16
Fuljo de control try-catch-finally
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 17
Propagación de Excepciones
• En vez de capturar una excepción a través de una
sentencia try-catch statement, podemos propagarla
hacia el método llamador.
• En este caso la cabecera del método debe incluir la
palabra reservada throws.
public int getAge( ) throws NumberFormatException {
. . .
int age = Integer.parseInt(inputStr);
. . .
return age;
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 18
Propagando Excepciones
• Podemos escribir un método que propague la
excepción directamente
• Para crear excepciones, def por el usuario, se usa
throw para crear una nueva instancia de la excepción.
• La cabecera del método debe incluir la palabra throws.
public void doWork(int num) throws Exception {
. . .
if (num != val) throw new Exception("Invalid val");
. . .
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 19
Método lanzador de excepciones
• Cuando un método puede propagar una
excepción, directa o indirectamente, se llama
lanzador de excepción
• Cada excepción lanzada puede ser de uno de los
dos tipos,
- captada (catcher)
- propagada
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 20
Tipos de lanzadores de Excepciones
• Un atrapador de excepciones es un lanzador de
excepciones que incluye un bloque catch que
maneja la excepción lanzada, es decir la captura.
. Un propagador de excepciones no contine ningún
bloque cath que coincida con esa excepción
• Un método puede atrapar unas excepciones y
propagar otras.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 21
Ej de secuencia de llamados
Nota: output == System.out
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 22
Tipos de Excepciones
• Todos los errores lanzados son casos de la clase
Throwable o de sus subclases
• Los errores serios son representados por instancias
de la clase Error o de sus subclasses, fallo de sistema
en general no se pueden manejar, fin de conexión, etc.
• Las excepciones que las aplicaciones pueden manejar
se representan con instancias de la clase Exception o
por subclases de la misma
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 23
Como emplear excepciones ej de
Fraction
• Recordemos el método para obtener el denom de la clase
Fraction, este termina abruptamente la ejecución.
public void set Denominator (int denom){
if (denom == 0){
System.err.println(“Error fatal”);
System.exit(1);
}
denominator = denom;
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 24
Empleando excepciones en
setDenominator de Fraction
public void setDenominator (int denom) throws
IllegalArgumentException {
if (denom == 0) {
throw new IllegalArgumentException(
“Denominador no puede ser cero”);
}
denominator = denom;
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 25
Jerarquía de Throwable
• Hay más de 60 clases in la jerarquía
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 26
Checked vs. Runtime
• Hay dos tipos de excepciones:
– Verificadas, se verifican en tiempo de
compilación
– No Verificadas: Todas las demás, se
detectan sólo al momento de ejecutarse
el programa
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 27
Diferentes Reglas de Manejo
• Cuando llamamos a un método que puede lanzar una
excepción en tiempo de compilación se debe manejar
o progagar:
– Usar una sentencia try-catch y poner la llamada en el
bloque try block, o
– Modificar la cabecera del método para incluir la cláusula
throws apropiada
• Cuando llamamos a un método que puede lanzar una
excepción en tiempo de ejecución, es opcional el uso de la
sentencia try-catch o modificar el método para o incluir la
cláusula throws.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 28
Manejo de excepciones en tiempo de
compilación (Checked Exceptions)
Manejar
Propagar
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 29
Manejando Excepciones en tiempo de
ejecución
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 30
Excepciones definidas por el
programador
• Se puede usar el método getMessage de las
clases estándard para obtener el mensaje de error
• Definiendo nuestras propias excepciones se
puede obtener más información
– Ej podemos definir la excepción FueraDeStock
(OutOfStock) e incluir información tal como cuando
items hay que ordenar
• ExcepcionIngresoEdad (AgeInputException) se
define como una subclase de Exception e incluye
métodos públicos para acceder a: limite máximo y
mínimo y la edad ingresada por el usuario
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 31
Excepciones declaradas por el usuario
Ej AgeInputVer4.java le permite al cliente que usará una clase
especificar los limites
AgeInputVer4 input = new AgeInputVer4 (10,20);
El constructor por defecto podria poner los limites inferior y
superior a 0, 99
Cómo responde getAge cuando detecta un ingreso por fuera del
rango?
En vez de capturarlo deberia propagarlo al método llamador. La
captura del error por ingreso de NumberFormatException aun
se debe manejar pues no depende del uso que el cliente hace
de la clase
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 32
Ej excepción pasada al cliente getAge
public int getAge (String prompt) throws Exception {
String inputStr; int age;
while (true) {
inputStr = JOptionPane.showInputDialog(null, prompt);
try {
age = Integer.parseInt (inputStr);
if (age<lowerBound || age > upperBound) {
throw new Exception (“Ingreso fuera de los lim”);
}
// excepcion pasada a la clase cliente, no atrapada
return age;
} cath (NumberFormatException e){
JOptionPane.showMessageDialog( null, “ingreso inválido,
ingrese sólo digitos” );
} } }
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 33
Excepciones definidas por el
programador
• Para proveer a la clase cliente de información útil cuando
se produce una excepción, definir una nueva clase
excepción. Hacer que la misma sea subclase de la clase
Exception.
• Ej. Definir una clase AgeInputException como subclase de
la clase Exception.
• Agregemos la infomación útil para el usuario, límite
superior, lim inferior, valor ingresado, además del mensaje.
• Definir métodos públicos para acceder a sus valores.
• La nueva clase será igual a la anterior con la diferencia
que el método getAge dispara una excepción
AgeInputException.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 34
Resumen
• Un prog puede usar excepciones para indicar la ocurrencia de un error
• Para propagar una excepción se usa throws y un objeto descendiente
de Throwable para informar sobre la excepción que se ha producido.
• Un método puede propagar o atrapar una excepción.
• Las excepciones verificadas (compilación) deben incluir una cláusula
throws
• Un programa atrapa excepciones empleando try catch finally.
• El bloque try contiene el código que puede generar una excepción. El
catch el código que maneja una excepción en particular.
• Un try debe tener al menos un catch o un finally y puede tener varios
catch.
• La clase de objeto excepción indica el tipo de excepción lanzada.
• El objeto puede contener infomación adicional sobre el error,
incluyendo mensajes de error.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 35
Afirmaciones
• La sintáxis para una afirmación (assert) es
assert <boolean expression>;
donde <boolean expression> representa una
condición que debe ser verdadera si el código
está trabajando correctamente.
• Si la expresión es falsa, un error AssertionError
( subclase de Error) es lanzada.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 36
Ej. Uso #1
public double deposit(double amount) {
double oldBalance = balance;
balance += amount;
assert balance > oldBalance;
}
public double withdraw(double amount) {
double oldBalance = balance;
balance -= amount;
assert balance < oldBalance;
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 37
Segunda forma
• La sentencia tambien tomar la forma:
assert <boolean expression>: <expression>;
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 38
Ej Uso #2
public double deposit(double amount) {
double oldBalance = balance;
balance += amount;
assert balance > oldBalance :
"Serious Error – balance did not " +
" increase after deposit";
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 39
Compilando Programas con Afirmaciones
Assertions
• Antes de Java 2 SDK 1.4, la palabra assert es un
identificador válido no reservado. Desde la version
1.4 la palabra assert se continua tomando como
identificador válido para asegurar.
• Para habilirar el mecanismo de assertion compilar
el código usando –source 1.4
javac –source 1.4 <source file>
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 40
Correr programas con Afirmaciones
• Para correr programas con afirmaciones
habilitadas usar:
java –ea <main class>
• Si no se pone la opción –ea option el programa se
ejecuta sin verificar las afirmaciones.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 41
Usos de Afirmaciones
• Precondición verifica que una condición sea
verdadera antes de la ejecución de un método.
• Postcondición verifica que una condición sea
verdadera despues de la ejecución de un método.
• Invariante del flujo de control (control-flow
invariant) se utiliza para afirmar que el control
debe fluir a casos particulares.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 42
Problema
Implementar un Sistema de entrada sin llaves que pide tres
datos: el nombre de residente, el número del espacio, y
una contraseña.
La contraseña es usa secuencia de 4 a 8 caracteres y es
única para cada residente
Si todo coincide, el sistema desbloquea y se abre la puerta
No puede haber dos residentes con el mismo nombre
Usaremos las clasesDoor and Dorm.
Se pueden usar datos del ejemplo samplelist.dat para el
desarrollo
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 43
Plan General
• Tareas:
– Debemos primero ver de que son capaces las
clases Dorm y Door.
– Tambien, para implementar la clase
correctamente, necesitamos la especificacion de
la clase Resident.
• Ademas de las clases dadas de ayuda y de
la clase Resident, necesitamos diseñar otras
clases para esta aplicación.
– Como el numero de clases puede aumentar
considerablemente, deben planificarse de manera
apropiada.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 44
Documento de Diseño
Clase
Propósito
Ch8EntranceMonitor
Objeto de control que maneja a los otros objetos del
programa. Contiene al método main.
Door
Clase predefinida que simula la apertura de la
puerta (door).
Dorm
Clase predefinida que mantiene la lista de objetos
Resident.
Resident
Clase que mantiene la informacion de un individuo
residente. Debemos escribirla.
InputHandler
Clase de interfase de usuario para manejar las
rutinas de ingreso de informacion.
JOptionPane
Clase estandard para mostrar mensajes.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 45
Relación de Clases
InputFrame
Ch8EntranceMonitor
Dorm
(main class)
JOptionPane
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
Door
Resident
4th Ed Chapter 8 - 46
Pasos de Desarrollo
1. Definir la clase Resident y explorar la clase
Dorm. Comenzar con un esqueleto para probar
la clase Resident.
2. Definir la clase InputHandler. Modificar la clase
de control si es necesario.
3. Finalizar el código haciendo mejoras y limpiando
los mensajes no apropiados.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 47
paso 1 Deseño
• Explorar la clase Dorm
• Implementar la clase Resident
• Comenzar con el esqueleto de la
clase principal
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 48
Paso 1 Código
Directory:
Chapter8/Step1
Source Files: Resident.java
Ch8EntranceMonitor.java
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 49
Paso 1 prueba
• El objetivo es verificar que la clase Dorm
class se usa correctamente para abrir un
archivo y obtener el contenido del mismo
• Para esto se necesita el arch que contiene la
información de los residentes: testfile.dat.
– Este contiene informacion de 4 residentes.
– Este fue creado ejecutando
SampleCreateResidentFile, que puede
modificarse para obtener otros datos de prueba
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 50
Paso 2 Diseño
• Diseñar e implementar la clase InputHandler
• Modificar la clase principal para incorporar las
nuevas clases
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 51
Paso 2 Código
Directory:
Chapter8/Step2
Source Files: Resident.java
Ch8EntranceMonitor.java
InputHandler.java
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 52
Paso 2 Prueba
• El objetivo es verificar el correcto
comportamiento de InputHandler.
• Debemos probar ambos casos éxito y
fracaso.
– Debemos verificar que la puerta se abre cuando la
información ingresada es válida.
– y Tambien que muestre un mensaje de error
cuando el ingreso es incorrecto.
• Se puede probar ingresando nombres inexistentes,
nombre correcto pero clave errónea, no entrar
información, etc
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 53
Paso 3: Finalizar
• Posibles extensiones
– Mejorar la interfase del usuario haciendo una ventana
para ingresar las tres datos de cada residente.
– Terminanar el programa cuando se ingresa un código
en especial.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 8 - 54