Exceptions y Assertions Introducción a la terminología Bloques: try, catch Uso de finally Bloques:...
-
Upload
chuy-santibanez -
Category
Documents
-
view
60 -
download
5
Transcript of Exceptions y Assertions Introducción a la terminología Bloques: try, catch Uso de finally Bloques:...
Exceptions y Assertions Introducción a la terminología Bloques: try, catch Uso de finally Bloques: try, catch, finally Categorías de Exceptions Excepciones comunes Mis excepciones Manejo de Excepciones
Mecanismos que permiten detectar errores fácilmente sin escribir código especial para testear valores de retorno
Mantienen el código de manejo del error separado de el que genera el error
Las excepciones manejan situaciones inesperadas:₋ Archivo no encontrado, falla en la red, argumento
ilegal,etc
Las assertions documentan y testean los supuestos del programa
₋ “Esto nunca puede ser negativo”
Los testeos de assertions pueden eliminarse completamente del código, así no hace más lenta la ejecución
El término exception significa “condición excepcional” y se da cuando se altera el flujo normal de un programa.
Cuando ocurre un evento excepcional en Java, se dice que se lanza (throw) una excepción.
Al código que es responsable de hacer algo al respecto se le llama exception handler y es quien atrapa (catch) la excepción que se lanzó.
Por ejemplo, cuando se invoca un método que abre un archivo y este no puede ser abierto, la ejecución de ese método se termina y el código que maneja ese error se ejecuta.
Para esto se precisa una forma de decirle a la JVM que código ejecutar cuando cierta excepción es lanzada.
El try se utiliza para definir un bloque de código que puede lanzar una excepción
Luego se define una o más cláusulas catch que atrapen ciertas excepciones y definen el código manejador de la misma.
Si se tiene uno o más bloques catch, estos deben aparecer inmediatamente después de un bloque try.
Todos los bloques catch deben aparecer uno a continuación del otro
Los bloques try y catch no resuelven el problema de cómo limpiar los recursos luego de un error
Para resolver este problema, Java provee el bloque finally
Este bloque siempre se ejecuta luego del try, se haya lanzado una excepción o no
Es legal utilizar un bloque try sin un catch o finally
Un bloque try sin ambas da error de compilación
Los bloques catch deben aparecer siguiendo al bloque try
El bloque finally debe aparecer luego de los catch
Es legal omitir los catch o el finally pero no ambos
Existen dos grandes categorías de excepciones:
₋ Checked
₋ Unchecked
La clase Exception es la clase base que representa las excepciones checked.
La clase RuntimeException es la clase base que representa las excepciones uncheked.
La clase Error es la clase base que representa los errors.
ArithmeticException
NullPointerException
NegativeArraySizeException
ArrayIndexOutOfBoundsException
SecurityException
¿Por que los catch no son requeridos?
¿Que pasa cuando se lanza una excepción de un bloque try que no tiene catch asociado?
Si la excepción no es manejada en el bloque try-catch actual, es lanzada al método que lo invocó.
Si la excepción llega al método main y no es manejada, el programa termina de forma abrupta
A continuación vemos un ejemplo de como utilizar un bloque con un try sin hacer uso del catch.
En este ejemplo, se lee la primer línea de un archivo. Se utiliza una instancia de la clase BufferedReader para leer los datos del archivo. Como vemos, la variable utilizada es cerrada en el bloque finally.
Cuando se lanza una excepción, Java intentará encontrar la cláusula catch para el tipo correspondiente de excepción
Si no encuentra una, seguirá buscando por la jerarquía de herencia hacia arriba
Si no encuentra nada que matchee entonces la excepción se propaga por el stack de llamadas
Importante: los handlers para las excepciones más específicas deben colocarse entes que los más generales
Cuando se detecta que ha ocurrido un error podemos crear una excepción y lanzarla
if ( n < 0) {throw new Exception(“numero negativo”);
}
Para declarar que el método lanza una excepción hay que utilizar la palabra throws
Cuando se sobrescribe un método que lanza alguna excepción, éste puede lanzar las mismas excepciones o alguna subclase de las mismas.
No puede lanzar más de lo que lanza el método padre.
A continuación vemos un ejemplo en el cual el método toString para la clase Empleado, fue sobre escrito.
Para lanzar una excepción definida por el usuario, utilice la siguiente sintaxis:
throw new NombreClaseException();
Simpre instancie la exception en la misma línea donde se lanza, porque la excepción toma el número de línea dónde fue creada.
En el ejemplo anterior, definimos un método llamado divide, el cual recibe dos números.
Si el segundo número es cero, entonces se lanza una excepción de tipo MiException.
Como vemos, el método debe tener la declaración de dicha excepción.
Existen dos sintaxis permitidas para la sentencia assert
assert <<boolean_expression> ;
assert <<boolean_expression>> :<<detail_expression>> ;
Si la <<boolean_expression>> retorna false, entonces un AssertionError es lanzado.
El segundo argumento es convertido a String y usado como texto descriptivo en el mensaje de AssertionError.
Para la documentación y verificación de supuestos asumidos en la lógica de un método:
₋ Invariantes internas₋ Control de flujo invariante₋ PostCondiciones e invariantes de clase
No es recomendado para el control de precondiciones en métodos públicos
if ( x > 0 ){
//……..
}
else{
//……..
}
if ( x > 0 ){//……..}else{assert(x>=0);//……..}
public Object pop(){int size = this.getElementCount();if(size == 0){
throw new RuntimeException(“Error..”)}//hace el trabajo de pop//test postcondicionassert (this.getElementCount() == size-1 )return value;
}
Si las assertion están deshabilitadas, el código ejecuta tan rápido como si no estuvieran.
Assertion están deshabilitadas por defecto₋ Para habilitarlas
₋ java -enableassertions ₋ java -ea
₋ Para dehabilitarlas₋ java -disableassertions₋ java -da
Comando Que significa?
java -eaJava –enableassertions
Habilita assertions
java -dajava –disableassertions
Deshabilita assertions
java –ea:com.foo.Bar Habilita asserts en la clase com.foo.Bar
java –ea:com.foo Habilita asserts en paquete com.foo.Bar y sus subpaquetes
java –ea –dsa Habilita asserts en general, deshabilita asserts en clases system
java –ea –da:com.foo Habilita asserts en general, deshabilita asserts en paquete com.foo y sus subpaquetes.
Exceptions y Assertions: diferencias Introducción a la terminología Bloques: try, catch Uso de finally Bloques: try, catch, finally Categorías de Exceptions Excepciones comunes Mis excepciones Manejo de Excepciones Ejemplos
Thinking in Java₋ Bruce Eckel
The Java Tutorial₋ http://download.oracle.com/javase/tutorial/essential
/exceptions/
Introduction to Java Exception Handling₋ http://tutorials.jenkov.com/java-exception-handling/
index.html