Java excepciones

22
JAVA / EXCEPCIONES ISC. Maribel bueno quiñones ISC/MC. María Elena montes Almanza ISC/ME. Pedro celestino Ramírez EXCEPCIONES Una excepción es una situación anómala que puede producirse durante la ejecución de un programa, como pude ser un intento de división entera entre 0, un acceso a posición de un array fuera de los limites del mismo o un fallo durante la lectura de datos de la entrada / salida.

Transcript of Java excepciones

1 5 / 0 8 / 2 0 1 0

1

JAVA / EXCEPCIONES

ISC. Maribel bueno quiñones

ISC/MC. María Elena montes Almanza

ISC/ME. Pedro celestino Ramírez

EXCEPCIONES

� Una excepción es una situación anómala que

puede producirse durante la ejecución de un

programa, como pude ser un intento de

división entera entre 0, un acceso a posición

de un array fuera de los limites del mismo o un

fallo durante la lectura de datos de la entrada /

salida.

1 5 / 0 8 / 2 0 1 0

2

EXCEPCIONES

� Mediante la captura de excepciones, java

proporciona un mecanismo que permite al

programa sobreponerse a estas situaciones,

pudiendo el programador decidir las acciones a

realizar para cada tipo de excepción que pueda

ocurrir.

EXCEPCIONES

� Además de excepciones, en un programa java

pueden producirse errores. Un error representa

una situación anormal irreversible, como por

ejemplo un fallo de la maquina virtual. Por

regla general, un programa no deberá intentar

recuperarse de un error, dado que son

situaciones que se escapan al control del

programador

1 5 / 0 8 / 2 0 1 0

3

EXCEPCIONES

EXCEPCIONES� Cada tipo de excepción esta representada por

una subclase de ExceptionExceptionExceptionException mientras que los

errores son subclases de ErrorErrorErrorError. Ambas clases,

ExceptionExceptionExceptionException y ErrorErrorErrorError, son subclases de TrhowableTrhowableTrhowableTrhowable.

object

Throwable

Exception Error

Excepciones Errores

1 5 / 0 8 / 2 0 1 0

4

CLASES DE EXCEPCIÓN

� Al producirse una excepción en un programa,

se crea un objeto de la subclase de la

Exception a la que pertenece la excepción.

Como veremos mas adelante, este objeto

puede ser utilizado por el programa durante el

tratamiento de la excepción para obtener

información de la mismo.

JERARQUIA DE CLASES / EXCEPCIONES HABITUALES

Exception

IOException

ArithmeticException

NullPointerException

RuntimeException SQLException

IndexOutOfBoundException

ClassCastException

........

::::

1 5 / 0 8 / 2 0 1 0

5

TIPOS DE EXCEPCIONES

� Desde el punto de vista del tratamiento de una

excepción dentro de un programa, hay que

tener en cuenta que todas estas clases de

excepción se dividen en dos grandes grupo.

� ExcepcionesExcepcionesExcepcionesExcepciones marcadasmarcadasmarcadasmarcadas....

� ExcepcionesExcepcionesExcepcionesExcepciones nononono marcadasmarcadasmarcadasmarcadas....

EXCEPCIONES MARCADAS.EXCEPCIONES MARCADAS.EXCEPCIONES MARCADAS.EXCEPCIONES MARCADAS.

� Captura obligatoria.

� Se producen al invocar ciertos métodos dedeterminadas clases y son generadas (lanzadas).

� Todas as clases de excepciones, salvoRuntimeExceptionRuntimeExceptionRuntimeExceptionRuntimeException y sus subclases, pertenecen aeste tipo.

� Un ejemplo de excepción marcada es IOExceptionIOExceptionIOExceptionIOException.Esta excepción es lanzada por el métodoreadLinereadLinereadLinereadLine()()()() de la clase BufferedReaderBufferedReaderBufferedReaderBufferedReader cuando seproduce un error durante la operación de lectura.

1 5 / 0 8 / 2 0 1 0

6

EXCEPCIONES MARCADAS.EXCEPCIONES MARCADAS.EXCEPCIONES MARCADAS.EXCEPCIONES MARCADAS.

� Si en un bloque de código se invoca a algún

método que puede provocar una excepción

marcada y esta no se captura, el programa no

se compilara.

DECLARACIÓN DE UNA EXCEPCIÓN

� Los métodos que pueden provocar excepcionesmarcadas, deben declarar estas en la definición delmétodo.

� Para declarar una excepción se utiliza la palabra throwsthrowsthrowsthrows,seguida de la lista de excepciones que el método puedeprovocar:

� public String readLine() throws IOException

� Public void service(…) throws ServletException, IOException

� Así siempre que vayamos a utilizar algún método quetenga declaradas excepciones, hemos de tener presenteque estamos obligados a capturar dichas excepciones.

1 5 / 0 8 / 2 0 1 0

7

EXCEPCIONES NO MARCADAS

� Pertenecen a este grupo todas las excepciones

de tiempo de ejecución, es decir,

RuntimeExceptionRuntimeExceptionRuntimeExceptionRuntimeException y todas sus subclases.

EXCEPCIONES NO MARCADAS

� No es obligatorio capturar dentro de un programajava una excepción no marcada, el motivo es quegran parte de ellas (NullPointerExceptionNullPointerExceptionNullPointerExceptionNullPointerException,,,,ClassCastExceptionClassCastExceptionClassCastExceptionClassCastException,,,, etcetcetcetc....,,,,) se producen comoconsecuencia de una mala programación, por loque la solución no debe pasar por prepara alprograma para que sea capaz de recuperarse anteuna situación como ésta, sino por evitar que seproduzca. Tan sólo las excepciones de tipoArithmeticException es recomendable capturarlas.

1 5 / 0 8 / 2 0 1 0

8

EXCEPCIONES NO MARCADAS

� Si durante la ejecución de un programa java se

produce una excepción y ésta no capturada, la

maquina virtual provoca la finalización

inmediata del mismo, enviando a la consola el

volcado de pila con los datos de la excepción a

la consola, estos volcados de pila permiten al

programador detectar fallos de programación

durante la depuración del mismo.

EJEMPLO EXCEPCIONES NO MARCADAS

public class Division

{

public static void main (String[] args)

{

int k=4/0;

}

}

Ocurre

excepción

por

división

por cero

Volcado

de la pila

1 5 / 0 8 / 2 0 1 0

9

CAPTURA DE EXCEPCIONES

try{

// instrucciones donde se pueden producir excepciones

}

catch{

}

finally{

}

Proporcionan una forma elegante y estructurada de capturar excepciones dentro de un programa java,

CAPTURA DE EXCEPCIONES

trytrytrytry : elimina aquella o aquellasinstrucciones donde se puede produciruna excepción. Cuando esto sucede, elcontrol del programa se transfiere albloque catch definido para el tipo deexcepción que se ha producido,pasándole como parámetro laexcepción lanzada.

1 5 / 0 8 / 2 0 1 0

1 0

CAPTURA DE EXCEPCIONES

catchcatchcatchcatch : define las instrucciones

que deberán ejecutarse en caso

en caso de que produzca un

determinado tipo de excepción.

CAPTURA DE EXCEPCIONES

catchcatchcatchcatch : debe considerar lo siguiente:

�Puede haber tantos bloques catchcomo considere necesario.

�Cada catch servirá para tratar undeterminado tipo de excepción.

�NoNoNoNo pudiendopudiendopudiendopudiendo haberhaberhaberhaber dosdosdosdos oooo masmasmasmas catchcatchcatchcatchquequequeque tengantengantengantengan declaradadeclaradadeclaradadeclarada lalalala mismamismamismamisma claseclaseclaseclasedededede excepciónexcepciónexcepciónexcepción.

1 5 / 0 8 / 2 0 1 0

1 1

CAPTURA DE EXCEPCIONES

Un bloque catch sirve para capturar cualquierexcepción que se corresponde con el tipodeclarado o cualquiera de sus subclases.

CatchCatchCatchCatch ((((RuntimeExceptionRuntimeExceptionRuntimeExceptionRuntimeException e)e)e)e)

{{{{

::::

}}}}

Produciría cualquiera (NullPointerException,ArithmeticException, etc.)

CAPTURA DE EXCEPCIONES

Aunque haya varios posibles catchque puedan capturar unaexcepción, solosolosolosolo unounounouno dededede ellosellosellosellos seráseráseráseráejecutadoejecutadoejecutadoejecutado cuandocuandocuandocuando éstaéstaéstaésta seseseseproduzcaproduzcaproduzcaproduzca. El primer catch quecoincidente será el que seejecutará.

1 5 / 0 8 / 2 0 1 0

1 2

CAPTURA DE EXCEPCIONES

� finallyfinallyfinallyfinally.... Una vez terminada la ejecución, el

control del programa se transferirá al bloque

finally o si no existe a la instrucción siguiente al

ultimo bloque catch.

CAPTURA DE EXCEPCIONESpublic class PruebaExcepcion

{

public static void main (String[] args)

{

try

{

int s=4/0;

System.out.println("el programa sigue");

}

catch (ArithmeticException e)

{

System.out.println("division por cero");

}

catch (Exception e)

{

System.out.println("excepcion general");

}

System.out.println("fin de main");

}

}

1 5 / 0 8 / 2 0 1 0

1 3

CAPTURA DE EXCEPCIONES

� El control del programa nunca se devuelve allugar donde se producido la excepción.

� En el caso de que existan varios catch cuyasexcepciones están relacionadas por laherencia, los catch mas específicos deben deestar situados por delante de los masgenéricos. De no ser así, se producirá un errorde compilación puesto que los bloques catchmas específicos nunca se ejecutaran.

CAPTURA DE EXCEPCIONES

� public class PruebaExcepcion

� {

� public static void main (String[] args)

� {

� try

� {

� int s=4/0;

� System.out.println("el programa sigue");

� }

� catch (Exception e)

� {

� System.out.println("excepcion general");

� }

� catch (ArithmeticException e)

� {

� System.out.println("division por cero");

� }

� System.out.println("fin de main");

� }

� }

1 5 / 0 8 / 2 0 1 0

1 4

CAPTURA DE EXCEPCIONES

� Si se produce una excepción no marcada para

la que no se ha definido bloque catch, ésta

será propagada por la pila de llamadas hasta

encontrar un punto en el que se trate la

excepción. De no existir un tratamiento para la

misma, la maquina virtual abortara la

ejecución del programa y enviará un volcado de

pila a la consola.

CAPTURA DE EXCEPCIONES

Método 1

Método 2

Método n

Excepción no

tratada X

Llamadas a método

Llamadas a método ........

Propagación de la excepción

Propagación de la excepción

Propagación de una excepción en la pila de llamadas

1 5 / 0 8 / 2 0 1 0

1 5

CAPTURA DE EXCEPCIONES

� Los bloques catch son opcionales. Siempre que

existe un bloque finallyfinallyfinallyfinally, la creación de bloques

catchcatchcatchcatch después de un trytrytrytry es opcional. Si no se

cuenta con un bloque finallyfinallyfinallyfinally, entonces es

obligatorio disponer de al menos un bloque

catchcatchcatchcatch.

CAPTURA DE EXCEPCIONES

finally:

� Se ejecuta tanto si se produces una excepción o no.

� Si se produce una excepción este se ejecuta después del bloque catch.

� El bloque finally se ejecutará antes de propagar la excepción.

� Si no se produce excepción alguna en el interior de try, el bloque finally se ejecutará tras la ultima instrucción del try.

1 5 / 0 8 / 2 0 1 0

1 6

CAPTURA DE EXCEPCIONESpublic class Excepcion

{

public static void main (String[] args)

{

try

{

int s=4/0;

System.out.println("el programa sigue");

}

catch (ArithmeticException e)

{

System.out.println("division por cero");

}

catch (Exception e)

{

System.out.println("excepcion general");

}

finally

{

System.out.println("ejecucion de finally");

}

System.out.println("fin de main");

}

}

Aun existiendo una instrucción para

la salida del método (return), el

bloque finally se ejecutará antes de

que esto suceda

PROPAGACIÓN DE UNA EXCEPCIÓN

� En el caso de las excepciones marcadas,hemos visto cómo éstas deben ser capturadasobligatoriamente en un programa. Sinembargo, en el caso de que no se tengaprevisto ninguna acción particular para eltratamiento de una determinada excepción deeste tipo, es posible propagar la excepción sinnecesidad de capturarla, dejando que seanotras partes del programa las encargadas dedefinir las acciones para su tratamiento.

1 5 / 0 8 / 2 0 1 0

1 7

PROPAGACIÓN DE UNA EXCEPCIÓNimport java.io.*;

public class ExcepcionIO

{

public static void main (String[] args)

{

BufferedReader b=new BufferedReader(new InputStreamReader(System.in));

try

{

imprime(b);

}

catch (IOException e)

{

System.out.println("error en la lectura");

}

finally

{

System.out.println("ejecucionde finally");

}

System.out.println("fin de main");

}

static void imprime(BufferedReader bf) throws IOException

{

String n=bf.readLine(); //puede provocar una excepcion

System.out.println(n);

}

}

LANZAMIENTO DE UNA EXCEPCIÓN

� En determinados casos puede resultar útil generar ylanzar un excepción desde el interior de un determinadométodo. Esto puede utilizarse como un medio paraenviar un aviso a otra parte del programa, indicándoleque algo está sucediendo y no es posible continuar conla ejecución del normal del método.

� Para lanzar una excepción desde el código utilizamos laexpresión:

ThrowThrowThrowThrow objeto_excepcionobjeto_excepcionobjeto_excepcionobjeto_excepcion;;;;

Objeto_excepcion es un objeto de alguna subclase deExceptionExceptionExceptionException

1 5 / 0 8 / 2 0 1 0

1 8

EJEMPLO CAJEROpublic class Cajero

{

public static void main (String[] args)

{

Cuenta c=new Cuenta();

try

{

c.ingresar(100);

c.extraer(200);

}

catch (Exception e)

{

System.out.println("la cuenta no puede "+

" quedar en numeros rojos");

//lo ideal es manejar este objeto

System.out.println(e.getMessage());

}

}

}

EJEMPLO CUENTAclass Cuenta

{

double saldo;

public Cuenta()

{

saldo=0;

}

public void ingresar(double c)

{

saldo+=c;

}

// el metodo declara la excepcion que puede

// caudar una excepcion.

public void extraer(double c) throws Exception

{

if (saldo<c)

{

// creacion y lanzamiento de la excepcion

throw new Exception("el saldo es menor al retiro");

}

else

{

saldo-=c;

}

}

public double getSaldo()

{

return saldo;

}

}

Cuando se lanza una

excepción marcada desde el

método (todas lo son salvo

RumtimeException y sus

subclases) esta debedebedebedebe serserserser

declaradadeclaradadeclaradadeclarada enenenen lalalala cabeceracabeceracabeceracabecera deldeldeldel

métodométodométodométodo para que se pueda

propagar al punto de llamada

al mismo.

1 5 / 0 8 / 2 0 1 0

1 9

MÉTODOS PARA EL CONTROL DE UNA EXCEPCIÓN

� getMessage() mensaje osociado a la excepción.

� printStackTrace() envía a consola el volcado de

pila, para ver errores de varias excepciones.

� printStackTrace(PrintStream s) permite enviar

el volcado de pila a un objeto como un archivo.

CLASES DE EXCEPCIONES PERSONALIZADAS

� Cuando un método necesita lanzar una

excepción como forma de notificar una

situación anómala, puede suceder que las

clases de excepciones existentes no se

adecuen a las características de las situación

que quiere notificar.

� Por ejemplo en el caso anterior seria mas

eficiente un excepción de saldoInsuficiente.

� Siendo mas eficiente una excepción

personalizada

1 5 / 0 8 / 2 0 1 0

2 0

CAJERO EXCEPCIÓN PERSONALIZADApublic class CajeroExc

{

public static void main (String[] args)

{

Cuenta c=new Cuenta();

try

{

c.ingresar(100);

c.extraer(20);

}

catch (SaldoInsuficienteException e)

{

System.out.println("la cuenta no puede "+

" quedar en numeros rojos");

//lo ideal es manejar este objeto

System.out.println(e.getMessage());

}

}

}

CAJERO EXCEPCIÓN PERSONALIZADAclass Cuenta

{

double saldo;

public Cuenta()

{

saldo=0;

}

public void ingresar(double c)

{

saldo+=c;

}

// el metodo declara la excepcion que puede

// causar una excepcion.

public void extraer(double c) throws SaldoInsuficienteException

{

if (saldo<c)

{

// creacion y lanzamiento de la excepcion

throw new SaldoInsuficienteException("el saldo es menor al retiro");

}

else

{

saldo-=c;

}

}

public double getSaldo()

{

return saldo;

}

}

1 5 / 0 8 / 2 0 1 0

2 1

CAJERO EXCEPCIÓN PERSONALIZADA

public double getSaldo()

{

return saldo;

}

}

class SaldoInsuficienteException extends Exception

{

public SaldoInsuficienteException (String mensaje)

{

super(mensaje);

}

}

PRACTICA

� Practica ejercicios realizado en taller

modificarlos para colocarle las excepciones

� Modificar el ejercicio 4.1 pag. 201 .

� Pag. 185 polimorfismo

1 5 / 0 8 / 2 0 1 0

2 2

BIBLIOGRAFIA

� Sierre, Antonio J. Martín, programador java2

curso practico, alfamomega, México 2007