Está en la página 1de 22

1 5 / 0 8 / 2 0 1 0

ISC. Maribel bueno quiones


ISC/MC. Mara Elena montes Almanza
ISC/ME. Pedro celestino Ramrez

JAVA / EXCEPCIONES

EXCEPCIONES

 Una excepcin es una situacin anmala que


puede producirse durante la ejecucin de un
programa, como pude ser un intento de
divisin entera entre 0, un acceso a posicin
de un array fuera de los limites del mismo o un
fallo durante la lectura de datos de la entrada /
salida.

1
1 5 / 0 8 / 2 0 1 0

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 excepcin que pueda
ocurrir.

EXCEPCIONES

 Adems de excepciones, en un programa java


pueden producirse errores. Un error representa
una situacin 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

2
1 5 / 0 8 / 2 0 1 0

EXCEPCIONES

EXCEPCIONES
 Cada tipo de excepcin esta representada por
una subclase de Exception mientras que los
errores son subclases de Error.
Error Ambas clases,
Exception y Error,
Error son subclases de Trhowable.
Trhowable
object

Throwable

Exception Error

Excepciones Errores

3
1 5 / 0 8 / 2 0 1 0

CLASES DE EXCEPCIN

 Al producirse una excepcin en un programa,


se crea un objeto de la subclase de la
Exception a la que pertenece la excepcin.
Como veremos mas adelante, este objeto
puede ser utilizado por el programa durante el
tratamiento de la excepcin para obtener
informacin de la mismo.

JERARQUIA DE CLASES / EXCEPCIONES


HABITUALES
Exception

RuntimeException
IOException
SQLException ..
ArithmeticException

NullPointerException

IndexOutOfBoundException

ClassCastException

4
1 5 / 0 8 / 2 0 1 0

TIPOS DE EXCEPCIONES

 Desde el punto de vista del tratamiento de una


excepcin dentro de un programa, hay que
tener en cuenta que todas estas clases de
excepcin se dividen en dos grandes grupo.
 Excepciones marcadas.
marcadas.
 Excepciones no marcadas.
marcadas.

EXCEPCIONES MARCADAS.
 Captura obligatoria.
 Se producen al invocar ciertos mtodos de
determinadas clases y son generadas (lanzadas).
 Todas as clases de excepciones, salvo
RuntimeException y sus subclases, pertenecen a
este tipo.
 Un ejemplo de excepcin marcada es IOException.
IOException
Esta excepcin es lanzada por el mtodo
readLine()
readLine() de la clase BufferedReader cuando se
produce un error durante la operacin de lectura.

5
1 5 / 0 8 / 2 0 1 0

EXCEPCIONES MARCADAS.

 Si en un bloque de cdigo se invoca a algn


mtodo que puede provocar una excepcin
marcada y esta no se captura, el programa no
se compilara.

DECLARACIN DE UNA EXCEPCIN


 Los mtodos que pueden provocar excepciones
marcadas, deben declarar estas en la definicin del
mtodo.
 Para declarar una excepcin se utiliza la palabra throws,
throws
seguida de la lista de excepciones que el mtodo puede
provocar:
 public String readLine() throws IOException
 Public void service() throws ServletException, IOException
 As siempre que vayamos a utilizar algn mtodo que
tenga declaradas excepciones, hemos de tener presente
que estamos obligados a capturar dichas excepciones.

6
1 5 / 0 8 / 2 0 1 0

EXCEPCIONES NO MARCADAS

 Pertenecen a este grupo todas las excepciones


de tiempo de ejecucin, es decir,
RuntimeException y todas sus subclases.

EXCEPCIONES NO MARCADAS
 No es obligatorio capturar dentro de un programa
java una excepcin no marcada, el motivo es que
gran parte de ellas (NullPointerException
NullPointerException,
NullPointerException,
ClassCastException,
ClassCastException, etc.
etc.,) se producen como
consecuencia de una mala programacin, por lo
que la solucin no debe pasar por prepara al
programa para que sea capaz de recuperarse ante
una situacin como sta, sino por evitar que se
produzca. Tan slo las excepciones de tipo
ArithmeticException es recomendable capturarlas.

7
1 5 / 0 8 / 2 0 1 0

EXCEPCIONES NO MARCADAS

 Si durante la ejecucin de un programa java se


produce una excepcin y sta no capturada, la
maquina virtual provoca la finalizacin
inmediata del mismo, enviando a la consola el
volcado de pila con los datos de la excepcin a
la consola, estos volcados de pila permiten al
programador detectar fallos de programacin
durante la depuracin del mismo.

EJEMPLO EXCEPCIONES NO MARCADAS


Ocurre
excepcin
public class Division por
{ divisin
public static void main (String[] args) por cero
{
int k=4/0;
}
} Volcado
de la pila

8
1 5 / 0 8 / 2 0 1 0

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

try : elimina aquella o aquellas


instrucciones donde se puede producir
una excepcin. Cuando esto sucede, el
control del programa se transfiere al
bloque catch definido para el tipo de
excepcin que se ha producido,
pasndole como parmetro la
excepcin lanzada.

9
1 5 / 0 8 / 2 0 1 0

CAPTURA DE EXCEPCIONES

catch : define las instrucciones


que debern ejecutarse en caso
en caso de que produzca un
determinado tipo de excepcin.

CAPTURA DE EXCEPCIONES
catch : debe considerar lo siguiente:
 Puede haber tantos bloques catch
como considere necesario.
 Cada catch servir para tratar un
determinado tipo de excepcin.
 No pudiendo haber dos o mas catch
que tengan declarada la misma clase
de excepcin.
excepcin

1 0
1 5 / 0 8 / 2 0 1 0

CAPTURA DE EXCEPCIONES
Un bloque catch sirve para capturar cualquier
excepcin que se corresponde con el tipo
declarado o cualquiera de sus subclases.
Catch (RuntimeException e)
{
:
}
Producira cualquiera (NullPointerException,
ArithmeticException, etc.)

CAPTURA DE EXCEPCIONES

Aunque haya varios posibles catch


que puedan capturar una
excepcin, solo uno de ellos ser
ejecutado cuando sta se
produzca.
produzca El primer catch que
coincidente ser el que se
ejecutar.

1 1
1 5 / 0 8 / 2 0 1 0

CAPTURA DE EXCEPCIONES

 finally.
finally. Una vez terminada la ejecucin, el
control del programa se transferir al bloque
finally o si no existe a la instruccin siguiente al
ultimo bloque catch.

CAPTURA DE EXCEPCIONES
public 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 2
1 5 / 0 8 / 2 0 1 0

CAPTURA DE EXCEPCIONES
 El control del programa nunca se devuelve al
lugar donde se producido la excepcin.
 En el caso de que existan varios catch cuyas
excepciones estn relacionadas por la
herencia, los catch mas especficos deben de
estar situados por delante de los mas
genricos. De no ser as, se producir un error
de compilacin puesto que los bloques catch
mas especficos 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 3
1 5 / 0 8 / 2 0 1 0

CAPTURA DE EXCEPCIONES

 Si se produce una excepcin 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
excepcin. De no existir un tratamiento para la
misma, la maquina virtual abortara la
ejecucin del programa y enviar un volcado de
pila a la consola.

CAPTURA DE EXCEPCIONES

Mtodo 1
Llamadas a mtodo

Mtodo 2
..Llamadas a mtodo
Propagacin de la excepcin
Mtodo n
Excepcin no
tratada X

Propagacin de la excepcin

Propagacin de una excepcin en la pila de llamadas

1 4
1 5 / 0 8 / 2 0 1 0

CAPTURA DE EXCEPCIONES

 Los bloques catch son opcionales. Siempre que


existe un bloque finally,
finally la creacin de bloques
catch despus de un try es opcional. Si no se
cuenta con un bloque finally,
finally entonces es
obligatorio disponer de al menos un bloque
catch.
catch

CAPTURA DE EXCEPCIONES
finally:
 Se ejecuta tanto si se produces una excepcin o
no.
 Si se produce una excepcin este se ejecuta
despus del bloque catch.
 El bloque finally se ejecutar antes de propagar la
excepcin.
 Si no se produce excepcin alguna en el interior
de try, el bloque finally se ejecutar tras la ultima
instruccin del try.

1 5
1 5 / 0 8 / 2 0 1 0

CAPTURA DE EXCEPCIONES
public 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"); Aun existiendo una instruccin para
}
System.out.println("fin de main");
la salida del mtodo (return), el
}
bloque finally se ejecutar antes de
} que esto suceda

PROPAGACIN DE UNA EXCEPCIN


 En el caso de las excepciones marcadas,
hemos visto cmo stas deben ser capturadas
obligatoriamente en un programa. Sin
embargo, en el caso de que no se tenga
previsto ninguna accin particular para el
tratamiento de una determinada excepcin de
este tipo, es posible propagar la excepcin sin
necesidad de capturarla, dejando que sean
otras partes del programa las encargadas de
definir las acciones para su tratamiento.

1 6
1 5 / 0 8 / 2 0 1 0

PROPAGACIN DE UNA EXCEPCIN


import 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("ejecucion de 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 EXCEPCIN


 En determinados casos puede resultar til generar y
lanzar un excepcin desde el interior de un determinado
mtodo. Esto puede utilizarse como un medio para
enviar un aviso a otra parte del programa, indicndole
que algo est sucediendo y no es posible continuar con
la ejecucin del normal del mtodo.
 Para lanzar una excepcin desde el cdigo utilizamos la
expresin:
Throw objeto_excepcion;
objeto_excepcion;
Objeto_excepcion es un objeto de alguna subclase de
Exception

1
7
1 5 / 0 8 / 2 0 1 0

EJEMPLO CAJERO
public 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 CUENTA
class Cuenta
{
double saldo;
public Cuenta()
{
saldo=0;
}
public void ingresar(double c)
{
saldo+=c;
}
// el metodo declara la excepcion que puede
Cuando se lanza una
// caudar una excepcion.
public void extraer(double c) throws Exception
excepcin marcada desde el
{
if (saldo<c)
mtodo (todas lo son salvo
{
// creacion y lanzamiento de la excepcion
RumtimeException y sus
}
throw new Exception("el saldo es menor al retiro");
subclases) esta debe ser
else
{
declarada en la cabecera del
}
saldo-=c;
mtodo para que se pueda
}
public double getSaldo()
propagar al punto de llamada
{
return saldo;
al mismo.
}
}

1 8
1 5 / 0 8 / 2 0 1 0

MTODOS PARA EL CONTROL DE UNA


EXCEPCIN
 getMessage() mensaje osociado a la excepcin.
 printStackTrace() enva 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 mtodo necesita lanzar una
excepcin como forma de notificar una
situacin anmala, puede suceder que las
clases de excepciones existentes no se
adecuen a las caractersticas de las situacin
que quiere notificar.
 Por ejemplo en el caso anterior seria mas
eficiente un excepcin de saldoInsuficiente.
 Siendo mas eficiente una excepcin
personalizada

1 9
1 5 / 0 8 / 2 0 1 0

CAJERO EXCEPCIN PERSONALIZADA


public 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 EXCEPCIN PERSONALIZADA


class 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;
}
}

2 0
1 5 / 0 8 / 2 0 1 0

CAJERO EXCEPCIN 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

2 1
1 5 / 0 8 / 2 0 1 0

BIBLIOGRAFIA

 Sierre, Antonio J. Martn, programador java2


curso practico, alfamomega, Mxico 2007

2 2