gravatar

08 Curso de Java OO. Manejo de Excepciones

Resumen: Se estudiara conceptos básicos para el manejo de excepciones, try, catch, finally, throw, throws.

1. EXCEPCIONES
1.1. Definiciones
Que es una excepción? Es un evento que interrumpe la ejecución de un programa
- Usar un índice fuera de los limites de un arreglo
- Dividir entre cero
- Realizar métodos de objetos nulos.
Que es un error?
En java es cuando la situación es irrecuperable y termina el programa.
- No hay memoria para correr JVM
- Errores internos en JVM
Cual es la diferencia?
Una excepción se puede controlar en el programa. Un error no.

1.2. Características del Java
Cuando ocurre una excepción en un método, Java lanza (throws) una excepcion (Exception).
El objeto Exception generado contiene el tipo de excepción, y el estado del programa cuando ocurrió el error.

Separando el manejo de errores
El manejo de excepciones en java permite separarlos del algoritmo principal.
El resultado es un código mas legible y menos propenso a errores de programación.

Manejo tradicional de errores.

int leerRegistroArchivo() {

int errorCode = 0;
abrirArchivo();
if (errorAbrirArchivo) {
errorCode = OPEN_ERROR;
}
else {
leerArchivo();
if (errorLeerArchivo) {
errorCode = READ_ERROR;
}
cerrarArchivo();
if (errorCerrarArchivo) {
errorCode = CLOSE_ERROR;
}
return errorCode;
}

Manejo de excepciones en Java.

leerRegistroArchivo() {
try {
abrirArchivo();
leerArchivo();
cerrarArchivo();
}
catch (errorAbrirArchivo) {
manejarErrorAbrirArchivo;
}
catch (errorLeerArchivo) {
manejarErrorLeerArchivo;
}
catch (errorCerrarArchivo) {
manejarErrorCerrarArchivo;
}
}

Java separa los detalles del manejo de errores del código principal, obteniéndose un código mas legible y menos propenso a errores de codificación.

1.3. Excepciones

Devolviendo la excepción hasta el manejador de excepciones.

No se requiere que cada método invocado maneje la excepción, sino únicamente lo hará el primer manejador de excepciones de la lista de métodos invocados.

Maneo Tradicional de errores

El método4 retorna el código de error al método3.

El método3 retorna el código de error al método2

El método2 retorna el código de error al metodo1

El metodo1 maneja el error.


Excepciones en Java

El metodo4 lanza una excepción

El metodo1 captura la excepción y la maneja

Las excepciones no pueden ignorarse

Una vez que un método lanza un error no puede ignorarse a diferencia de la programación tradicional donde se debe controlar en cada punto de invocación.
Maneo Tradicional de errores


1.4. Throwable

Todos los errores y excepciones heredan de la clase Throwable


Errores.

Heredan de la clase Error; estos se generan cuando ocurren errores fatales para el programa como por ejemplo: cuando la memoria esta llena o cuando es imposible encontrar una clase requerida.

Excepciones no controladas

Heredan de la clase RuntimeException.

Estas ocurren cuando por ejemplo se divide entre cero o se intenta acceder a un elemento del arreglo fuera de sus limites.

Mediante código se puede capturar, manipular o ignorar estas excepciones.

Si no maneja el error, el java terminara el programa indicando el estado del error.

Excepciones controladas

Heredan de la clase Exception.

Estas deben ser capturadas y manejadas en algun lugar de la aplicación.

Las excepciones creadas por el programador seran heredadas de la clase Exception.

1.5. Que se puede hacer con una Excepción?

Excepciones controladas

Se puede:

- Capturar la excepción y manipularla
- Pasar la excepción al método invocador.
- Capturar la excepción y lanzar una excepción diferente.

Excepciones no controladas

No necesitan ser controladas en el código.

El JVM terminara el programa cuando las encuentra.

Si no desea que el programa termine tendrá que manejarlas.

2. EXCEPCIONES CON JAVA

2.1. Como capturar y manejar una excepción

- Encierre el código del método en un bloque try
- Maneje cada exception en un bloque catch.
- Cualquier proceso final realícelo en un bloque finally. Este bloque siempre se ejecutara, ocurra o no una excepción.

try {
// código del método
}
catch (exception1) {
// manejar la excepción1
}
catch (exception2) {
// manejar la excepción2
}
...
finally {
// cualquier otro proceso final
}


La documentación del java indicara que excepciones lanzan los métodos en java.

Clase : java.io.FileInputStream
Constructor: public FileInputStream(String name) throws FileNotFoundException
Método: public int read() throws IOException

2.2. Capturando una excepción.

Este ejemplo convierte una cadena en un entero
int cantidad;

String cadena = "5";
try {
cantidad = Integer.parseInt(cadena);
}
catch ( NumberFormatException e) {
System.err.println(cadena + " no es un entero");
}

Laboratorio:

Pruebe este ejemplo en un programa TestException.java. Cambie la cadena por "cinco", "1.1", "2f".

2.3. Capturando múltiples excepciones

Este ejemplo convierte una cadena en un entero y realiza una division.

public class TestMultiException {
public static void main (String[] args) {
int cantidad= 0;
int divisor = 0;
String cadena = "5";
try {
cantidad = Integer.parseInt(cadena);
System.out.println(cantidad);
int resultado = cantidad / divisor;
System.out.println(resultado);
}
catch ( NumberFormatException e) {
System.err.println(cadena + " no es un entero");
}
catch ( ArithmeticException e) {
System.err.println("Error en "+cantidad+"/"+divisor);
}
}
}


Laboratorio:
Pruebe este ejemplo en un programa TestMultiException.java. Cambie la cadena por "cinco", "1.1", "5" y divisor cambie por 0, 1, 500

2.3. Ejecución del bloque finally

El bloque finally siempre se ejecuta dependiendo como se termina el bloque try.
- Hasta terminar la ultima sentencia del bloque try.
- Debido a sentencias return o break en el bloque try.
- Debido a una excepción.

public class TestFinally {
public static void main (String[] args) {
int cantidad= 0;
int divisor = 0;
String cadena = "5";
try {
if (cadena.equals("5"))
return;
cantidad = Integer.parseInt(cadena);
System.out.println(cantidad);
int resultado = cantidad / divisor;
System.out.println(resultado);
}
catch ( NumberFormatException e) {
System.err.println(cadena + " no es un entero");
}
catch ( ArithmeticException e) {
System.err.println("Error en "+cantidad+"/"+divisor);
}
finally {
System.err.println("Se trabajo con "+cadena+" y "+divisor);
}
}
}

Laboratorio:
Pruebe este ejemplo, cambie la cadena por "cinco", "1.1", "5" y divisor cambie por 0, 1, 500

2.4. Como pasar la excepción al método invocado.

Para pasar el método al invocador, se declara con la declaración throws.
La excepción se propaga al método que lo invoco.
En el ejemplo, las excepciones de los métodos se manejan en el método invocador.

public void metodoInvocador() {
try {
miMetodo();
getResultado();
}
catch {

//
}
finally {

//
}
}
public int miMetodo() throws Exception {
// código que podria lanzar la Exception
}
public int getResultado() throws NumberFormatException {
// código que podria lanzar la exception NumberFormatException
}

TestThrows.java
public class TestThrows {
public static void main (String[] args) {
String cadena = "abcde";
int posicion = 6;
char letra = ' ';
try {
letra = getLetra(cadena,posicion);
System.out.println(letra );
}
catch (IndexOutOfBoundsException e) {
System.err.println("Error en "+cadena+" "+posicion);
}
}

public static char getLetra(String cadena, int posicion)
throws IndexOutOfBoundsException
{
char c = cadena.charAt(posicion);
return c;
}
}

Laboratorio. Cambie posición 6 por –1, 0, 1

2.5. Como lanzar una excepción

Para lanzar una excepción use las declaraciones throws y throw
Puede crear excepciones para manejar posibles problemas en el código.

public String getValor(int indice) throws IndexOutOfBoundsException {
if (indice < 0 || indice > 100) {
throw IndexOutOfBoundsException();
}
}

2.6. Como crear una excepción

Para crear su propia excepción tiene que heredarla de la clase Exception.
Puede ser usado en caso quiera tratar cada problema en el código en forma diferente.
Por ejemplo el manejo del archivo1 puede tratarlo con una excepción1. El manejo de un archivo2 puede tratarlo con una excepcion2. Cada archivo tendria su propia excepción.

UserFileException.java
public class UserFileException extends Exception {
public UserFileException (String mensaje) {
super(mensaje);
}
}

2.7. Como capturar una excepción y lanzar otra diferente.

En el ejemplo si ocurre un problema de IO (entrada/salida) se captura la excepción y se lanza una excepción propia.

public void ReadUserFile throws UserFileException {
try {
// código que manipula un archivo
}
catch (IOException e) {
throw new UserFileException(e.toString());
}
}

3. LABORATORIO

Ensaye este ejemplo que muestra el uso de excepciones definidas por el usuario.

public class CerradoException extends Exception {
public CerradoException () {}
public CerradoException (String msg) {
super(msg);
}
}
public class TestCerradoException {
public static void main(String[] args) {
try {
abrirLaPuerta();
} catch(CerradoException e) {
// printStackTrace muestra la traza de la excepcion.
e.printStackTrace(System.err);
}
try {
abrirLaVentana();
} catch(CerradoException e) {
// System.err es el stream de salida de errores
// similar a System.out.
e.printStackTrace(System.err);
}
}
public static void abrirLaPuerta() throws CerradoException {
System.out.println("abrirLaPuerta()? tiene candado!");
throw new CerradoException ("Originado en abrirLaPuerta()");
}
public static void abrirLaVentana() throws CerradoException {
System.out.println("abrirLaVentana()? Esta con cerrojo!");
throw new CerradoException ("Originado en abrirLaVentana()");
}
}

4. EJERCICIO

Agregue los siguientes métodos al programa TestExcepcionTeclado.java. Cree excepciones para su control.

// método que lea solo un carácter.
public static char readChar(String etiqueta)...
// método que lea un decimal con enteros y decimales.
public static float readNumber(String etiqueta, int enteros, int decimales)...
// método que lea una dirección IP xxx.xxx.xxx.xxx
// 0 <= xxx <= 255
public static String readIP(String etiqueta)...
// método que lea un codigo valido de alumno UNI
public static String readCodigoUNI(String etiqueta)...
// método que lea una fecha valida
// formato dd/mm/yyyy
public static String readDate(String etiqueta)

TestExcepcionTeclado.java

import java.io.*;
public class TestExcepcionTeclado {
public static void main (String[] args) {
try {
String nombre = readString("Ingrese un nombre: ");
System.out.println("Su longitud es "+nombre.length());
int entero = readInt("Ingrese un entero: ");
System.out.println("El cuadrado es "+entero*entero);
}
catch (NumberFormatException e) {
System.out.println("Excepcion numerica");
e.printStackTrace(System.err);
}
catch (ArithmeticException e) {
System.out.println("Excepcion artimetica");
e.printStackTrace(System.err);
}
catch (IndexOutOfBoundsException e) {
System.out.println("Excepcion de arreglos");
e.printStackTrace(System.err);
}
catch (Exception e) {
System.out.println("Excepcion");
e.printStackTrace(System.err);
}
}
public static String readString(String etiqueta)
throws Exception
{
System.out.print(etiqueta);
String cadena="";
BufferedReader in = new BufferedReader(new
InputStreamReader(System.in));
cadena = in.readLine();
return cadena;
}
public static int readInt(String etiqueta)
throws Exception
{
int entero = 0;
String cadena = readString(etiqueta);
Integer enteroInteger = new Integer( cadena.trim());
entero = enteroInteger.intValue();
return entero;
}
}