Java excepciones
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