0% encontró este documento útil (0 votos)
56 vistas20 páginas

Unidad 5 Ppo

Las excepciones en Java son eventos que interrumpen el flujo normal de un programa y se utilizan para manejar errores de manera elegante, evitando que la aplicación se detenga abruptamente. Existen diferentes tipos de excepciones, como Error, Exception y RuntimeException, todas derivadas de la clase Throwable, y su manejo se realiza a través de bloques try, catch y finally. La gestión adecuada de excepciones mejora la robustez del código y permite a los programadores ofrecer mensajes de error claros y específicos al usuario.

Cargado por

gamaliel
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
56 vistas20 páginas

Unidad 5 Ppo

Las excepciones en Java son eventos que interrumpen el flujo normal de un programa y se utilizan para manejar errores de manera elegante, evitando que la aplicación se detenga abruptamente. Existen diferentes tipos de excepciones, como Error, Exception y RuntimeException, todas derivadas de la clase Throwable, y su manejo se realiza a través de bloques try, catch y finally. La gestión adecuada de excepciones mejora la robustez del código y permite a los programadores ofrecer mensajes de error claros y específicos al usuario.

Cargado por

gamaliel
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

5.

1 Definicin de excepciones

Una excepcin es un evento que ocurre durante la ejecucin de un programa y detiene


el flujo normal de la secuencia de instrucciones de ese programa; en otras palabras,
una excepcin es una condicin anormal que surge en una secuencia de cdigo durante
su ejecucin.
Las excepciones en Java estn destinadas, al igual que en el resto de los lenguajes que
las soportan, para la deteccin y correccin de errores. Si hay un error, la aplicacin
no debera morirse y generar un core (o un crash en caso del DOS). Se debera lanzar
(throw) una excepcin que a su vez debera capturar ( catch) y resolver la situacin de
error, o poder ser tratada finalmente ( finally) por un gestor por defecto u omisin.
Java sigue el mismo modelo de excepciones que se utiliza en C++. Utilizadas en forma
adecuada, las excepciones aumentan en gran medida la robustez de las aplicaciones.
La
gestin
de
excepciones
en
Java
proporciona
un
mecanismoexcepcionalmente poderoso para controlar programas que tengan muchas
caractersticas dinmicas durante su ejecucin. Las excepciones son formas muy
limpias de manejar errores y problemas inesperados en la lgica del programa, y no
deberan considerarse como un mecanismo general de ramificaciones o un tipo de
sentencias de salto. Los lugares ms indicados para utilizar excepciones son aquellos
en los que se usan valores como 0 o 1, en C/C++, para indicar algn fallo funcional. Por
ejemplo:
#include <sys/errno.h>
int fd;
fd = open( "leeme.txt" );
if( fd == -1 && errno == EEXIT )
fd = open( "defecto.txt" );
}
En este programa C, si falla la primera sentencia open() por cualquiera de las 19
razones distintas de EEXIT por las que puede fallar, entonces el programa se
continuara ejecutando y morira por alguna razn misteriosa ms adelante, dejando
atrs un problema de depuracin complicado y frustrante.
La versin Java del cdigo anterior, tal como se muestra a continuacin:
FilterReader fr;

try {
Fr = new FilterReader( "leeme.txt" );
} catch( FileNotFoundException e ) {
fr = new FilterReader( "defecto.txt" );
}

Proporciona una oportunidad para capturar una excepcin ms genrica y tratar la


situacin con elegancia o, en el peor de los casos, imprimira el estado de la pila de
memoria.
Por ello, que la utilizacin adecuada de las excepciones proporcionar un refinamiento
profesional al cdigo que cualquier usuario futuro de las aplicaciones que salgan de la
mano del programador que las utilice agradecer con toda seguridad

5.2 Tipos de excepciones


Qu es una excepcin?
Una excepcin es un evento que ocurre durante la ejecucin del programa que
interrumpe el flujo normal de las sentencias.
sea, algo que altera la ejecucin normal.
Muchas clases de errores pueden generar excepciones desde problemas de
hardware, como la avera de un disco duro, a los simples errores de
programacin, como tratar de acceder a un elemento de un array fuera de sus
lmites.
TIPOS DE EXCEPCIONES
Existen varios tipos fundamentales de excepciones:

Error: Excepciones que indican problemas muy graves, que suelen ser no
recuperables y no deben casi nunca ser capturadas.

Exception: Excepciones no definitivas, pero que se detectan fuera del


tiempo de ejecucin.

RuntimeException: Excepciones que se dan durante la ejecucin del


programa.

Todas las excepciones tienen como clase base la clase Throwable, que est
incluida en el paquete java.lang, y sus mtodos son:

Trowable( String mensaje ); Constructor. La cadena es opcional

Throwable fillInStackTrace(); Llena la pila de traza de ejecucin.

String getLocalizedMessage(); Crea una descripcin local de este objeto.

String getMessage(); Devuelve la cadena de error del objeto.

void printStackTrace( PrintStream_o_PrintWriter s ); Imprime este objeto


y su traza en el flujo del parmetro s, o en la salida estndar (por defecto).

String toString; Devuelve una breve descripcin del objeto.

Funcionamiento

Para que el sistema de gestin de excepciones funcione, se ha de trabajar en dos


partes de los programas:

Definir qu partes de los programas crean una excepcin y bajo qu


condiciones. Para ello se utilizan las palabras reservadas throw y throws.

Comprobar en ciertas partes de los programas si una excepcin se ha


producido, y actuar en consecuencia. Para ello se utilizan las palabras
reservadas try, catch y finally.

b)Manejo de excepciones: try - catch - finally

Cuando el programador va a ejecutar un trozo de cdigo que pueda provocar una


excepcin (por ejemplo, una lectura en un fichero), debe incluir este fragmento
de cdigo dentro de un bloque try:
try {
// Cdigo posiblemente problemtico
}

Pero lo importante es cmo controlar qu hacer con la posible excepcin que se


cree. Para ello se utilizan las clausulas catch, en las que se especifica que accin
realizar:
try {
// Cdigo posiblemente problemtico
} catch( tipo_de_excepcion e) {

// Cdigo para solucionar la excepcin e


} catch( tipo_de_excepcion_mas_general e) {
// Cdigo para solucionar la excepcin e
}

5.2 Tipos de excepciones


Qu es una excepcin?
Una excepcin es un evento que ocurre durante la ejecucin del programa que
interrumpe el flujo normal de las sentencias.
sea, algo que altera la ejecucin normal.
Muchas clases de errores pueden generar excepciones desde problemas de
hardware, como la avera de un disco duro, a los simples errores de
programacin, como tratar de acceder a un elemento de un array fuera de sus
lmites.
TIPOS DE EXCEPCIONES
Existen varios tipos fundamentales de excepciones:

Error: Excepciones que indican problemas muy graves, que suelen ser no
recuperables y no deben casi nunca ser capturadas.

Exception: Excepciones no definitivas, pero que se detectan fuera del


tiempo de ejecucin.

RuntimeException: Excepciones que se dan durante la ejecucin del


programa.

Todas las excepciones tienen como clase base la clase Throwable, que est
incluida en el paquete java.lang, y sus mtodos son:

Trowable( String mensaje ); Constructor. La cadena es opcional

Throwable fillInStackTrace(); Llena la pila de traza de ejecucin.

String getLocalizedMessage(); Crea una descripcin local de este objeto.

String getMessage(); Devuelve la cadena de error del objeto.

void printStackTrace( PrintStream_o_PrintWriter s ); Imprime este objeto


y su traza en el flujo del parmetro s, o en la salida estndar (por defecto).

String toString; Devuelve una breve descripcin del objeto.

Funcionamiento

Para que el sistema de gestin de excepciones funcione, se ha de trabajar en dos


partes de los programas:

Definir qu partes de los programas crean una excepcin y bajo qu


condiciones. Para ello se utilizan las palabras reservadas throw y throws.

Comprobar en ciertas partes de los programas si una excepcin se ha


producido, y actuar en consecuencia. Para ello se utilizan las palabras
reservadas try, catch y finally.

b)Manejo de excepciones: try - catch - finally

Cuando el programador va a ejecutar un trozo de cdigo que pueda provocar una


excepcin (por ejemplo, una lectura en un fichero), debe incluir este fragmento
de cdigo dentro de un bloque try:
try {
// Cdigo posiblemente problemtico
}

Pero lo importante es cmo controlar qu hacer con la posible excepcin que se


cree. Para ello se utilizan las clausulas catch, en las que se especifica que accin
realizar:
try {

// Cdigo posiblemente problemtico


} catch( tipo_de_excepcion e) {
// Cdigo para solucionar la excepcin e

} catch( tipo_de_excepcion_mas_general e) {
// Cdigo para solucionar la excepcin e
}

5.3 Propagacin de excepciones

La clusula catch comprueba los argumentos en el mismo orden en que aparezcan en el


programa. Si hay alguno que coincida, se ejecuta el bloque y sigue el flujo de control
por el bloque finally (si lo hay) y concluye el control de la excepcin.
Si ninguna de las clusulas catch coincide con la excepcin que se ha producido,
entonces se ejecutar el cdigo de la clusula finally (en caso de que la haya). Lo que
ocurre en este caso, es exactamente lo mismo que si la sentencia que lanza la
excepcin no se encontrase encerrada en el bloque try.
El flujo de control abandona este mtodo y retorna prematuramente al mtodo que lo
llam. Si la llamada estaba dentro del mbito de una sentencia try, entonces se vuelve
a intentar el control de la excepcin, y as continuamente.
Cuando una excepcin no es tratada en la rutina en donde se produce, lo que sucede es
lo siguiente. El sistema Java busca un bloque try..catch ms all de la llamada, pero
dentro del mtodo que lo trajo aqu. Si la excepcin se propaga de todas formas hasta
lo alto de la pila de llamadas sin encontrar un controlador especfico para la excepcin,
entonces la ejecucin se detendr dando un mensaje. Es decir, podemos suponer que
Java nos est proporcionando un bloque catch por defecto, que imprime un mensaje de
error, indica las ltimas entradas en la pila de llamadas y sale.
No hay ninguna sobrecarga en el sistema por incorporar sentencias try al cdigo. La
sobrecarga se produce cuando se genera la excepcin.
Se ha indicado ya que un mtodo debe capturar las excepciones que genera, o en todo
caso, declararlas como parte de su llamada, indicando a todo el mundo que es capaz de
generar excepciones. Esto debe ser as para que cualquiera que escriba una llamada a
ese mtodo est avisado de que le puede llegar una excepcin, en lugar del valor de
retorno normal. Esto permite al programador que llama a ese mtodo, elegir entre
controlar la excepcin o propagarla hacia arriba en la pila de llamadas. La siguiente
lnea de cdigo muestra la forma general en que un mtodo declara excepciones que se
pueden propagar fuera de l, tal como se ha visto a la hora de tratar la
sentenciathrows:
tipo_de_retorno( parametros ) throws e1,e2,e3 { }

Los nombres e1,e2,... deben ser nombres de excepciones, es decir, cualquier tipo que
sea asignable al tipo predefinido Throwable. Observar que, como en la llamada al
mtodo se especifica el tipo de retorno, se est especificando el tipo de excepcin
que puede generar (en lugar de un objetoException).
He aqu un ejemplo, tomado del sistema Java de entrada/salida:
byte readByte() throws IOException;
short readShort() throws IOException;
char readChar() throws IOException;

void writeByte( int v ) throws IOException;


void writeShort( int v ) throws IOException;
void writeChar( int v ) throws IOException;
Lo ms interesante aqu es que la rutina que lee un char, puede devolver un char; no el
entero que se requiere en C. C necesita que se devuelva un int, para poder pasar
cualquier valor a un char, y adems un valor extra (-1) para indicar que se ha alcanzado
el final del fichero. Algunas de las rutinas Java lanzan una excepcin cuando se
alcanza el fin del fichero.

Cuando se crea una nueva excepcin, derivando de una clase Exception ya existente,
se puede cambiar el mensaje que lleva asociado. La cadena de texto puede ser
recuperada a travs de un mtodo. Normalmente, el texto del mensaje proporcionar
informacin para resolver el problema o sugerir una accin alternativa. Por ejemplo:
class SinGasolina extends Exception {
SinGasolina( String s ) {
super( s );
}
....

// constructor

// Cuando se use, aparecer algo como esto


try {
if( j < 1 )
throw new SinGasolina( "Usando deposito de reserva" );
} catch( SinGasolina e ) {
System.out.println( o.getMessage() );
}
Esto, en tiempo de ejecucin originara la siguiente salida por pantalla:
> Usando deposito de reserva
Otro mtodo que es heredado de la superclase Throwable es printStackTrace().
Invocando a este mtodo sobre una excepcin se volcar a pantalla todas las llamadas
hasta el momento en donde se gener la excepcin (no donde se maneje la excepcin).
Por ejemplo:
// Capturando una excepcin en un mtodo
class testcap {
static int slice0[] = { 0,1,2,3,4 };

public static void main( String a[] ) {


try {
uno();
} catch( Exception e ) {
System.out.println( "Captura de la excepcion en main()" );
e.printStackTrace();
}

}
static void uno() {
try {
slice0[-1] = 4;
} catch( NullPointerException e ) {
System.out.println( "Captura una excepcion diferente" );
}
}
}
Cuando se ejecute ese cdigo, en pantalla observaremos la siguiente salida:
> Captura de la excepcion en main()
> java.lang.ArrayIndexOutOfBoundsException: -1
at testcap.uno(test5p.java:19)
at testcap.main(test5p.java:9)
Con todo el manejo de excepciones podemos concluir que se proporciona un mtodo
ms seguro para el control de errores, adems de representar una excelente
herramienta para organizar en sitios concretos todo el manejo de los errores y,
adems, que se pueden proporcionar mensajes de error ms decentes al usuario
indicando qu es lo que ha fallado y por qu, e incluso podemos, a veces, recuperar al
programa automticamente de los errores.
La degradacin que se produce en la ejecucin de programas con manejo de
excepciones est ampliamente compensada por las ventajas que representa en cuanto
a seguridad de funcionamiento de esos mismos programas.

5.4 Gestin de excepciones

Las excepciones son el mecanismo por el cual pueden controlarse en un


programa Java las condiciones de error que se producen. Estas condiciones de
error pueden ser errores en la lgica del programa como un ndice de un array
fuera de su rango, una divisin por cero o errores disparados por los propios
objetos que denuncian algn tipo de estado no previsto, o condicin que no
pueden manejar.
La idea general es que cuando un objeto encuentra una condicin que no sabe
manejar crea y dispara una excepcin que deber ser capturada por el que le
llam o por alguien ms arriba en la pila de llamadas. Las excepciones son
objetos que contienen informacin del error que se ha producido y que heredan
de la clase Throwable o de la clase Exception. Si nadie captura la excepcin
interviene un manejador por defecto que normalmente imprime informacin que
ayuda a encontrar quin produjo la excepcin.
Existen dos categoras de excepciones:

Excepciones verificadas: El compilador obliga a verificarlas. Son todas


las que son lanzadas explicitamente por objetos de usuario.

Excepciones no verificadas: El compilador no obliga a su verificacin.


Son excepciones como divisiones por cero, excepciones de puntero nulo,
o ndices fuera de rango.

Generacin de excepciones
Supongamos que tenemos una clase Empresa que tiene un array de objetos
Empleado (clase vista en captulos anteriores). En esta clase podramos tener
mtodos para contratar un Empleado (aadir un nuevo objeto al array),
despedirlo (quilarlo del array) u obtener el nombre a partir del nmero de
empleado. La clase podra ser algo as como lo siguiente:
public class Empresa {
String nombre;
Empleado [] listaEmpleados;
int totalEmpleados = 0;
...
Empresa(String n, int maxEmp) {
nombre = n;

listaEmpleados = new Empleado [maxEmp];


}
...
void nuevoEmpleado(String nombre, int sueldo) {
if (totalEmpleados < listaEmpleados.length ) {
listaEmpleados[totalEmpleados++] = new Empleado(nombre,sueldo);
}
}

}
Observese en el mtodo nuevoEmpleado que se comprueba que hay sitio en el
array para almacenar la referencia al nuevo empleado. Si lo hay se crea el
objeto. Pero si no lo hay el mtodo no hace nada ms. No da ninguna indicacin
de si la operacin ha tenido xito o no. Se podra hacer una modificacin para
que, por ejemplo el mtodo devolviera un valor booleano true si la operacin se
ha completado con xito y false si ha habido algn problema.
Otra posibilidad es generar una excepcin verificada (Una excepcin no
verificada se producira si no se comprobara si el nuevo empleado va a caber o
no en el array). Vamos a ver como se hara esto.
Las excepciones son clases, que heredan de la clase genrica Exception. Es
necesario por tanto asignar un nombre a nuestra excepcin. Se suelen asignar
nombres que den alguna idea del tipo de error que controlan. En nuestro
ejemplo le vamos a llamar CapacidadEmpresaExcedida.
Para que un mtodo lance una excepcin:

Debe declarar el tipo de excepcin que lanza con la clusula throws, en


su declaracin.

Debe lanzar la excepcin, en el punto del cdigo adecuado con la


sentencia throw.

En nuestro ejemplo:
void nuevoEmpleado(String
nombre, int sueldo) throws CapacidadEmpresaExcedida {
if (totalEmpleados < listaEmpleados.length) {
listaEmpleados[totalEmpleados++] = new Empleado(nombre,sueldo);
}

else throw new CapacidadEmpresaExcedida(nombre);


}
Adems, necesitamos escribir la clase CapacidadEmpresaExcedida. Sera algo
as:
public class CapacidadEmpresaExcedida extends Exception {
CapacidadEmpresaExcedida(String nombre) {
super("No es posible aadir el empleado " + nombre);
}
...
}
La sentencia throw crea un objeto de la clase CapacidadEmpresaExcedida . El
constructor tiene un argumento (el nombre del empleado). El constructor
simplemente llama al constructor de la superclase pasndole como argumento
un texto explicativo del error ( y el nombre del empleado que no se ha podido
aadir).
La clase de la excepcin puede declarar otros mtodos o guardar datos de
depuracin que se consideren oportunos. El nico requisito es que extienda la
clase Exception. Consultar la documentacin del API para ver una descripcin
completa de la clase Exception.
De esta forma se pueden construir mtodos que generen excepciones.
Captura de excepciones
Con la primera versin del mtodo nuevoEmpleado (sin excepcin) se invocara
este mtodo de la siguiente forma:
Empresa em = new Empresa("La Mundial");
em.nuevoEmpleado("Adn Primero",500);
Si se utilizara este formato en el segundo caso (con excepcin) el compilador
producira un error indicando que no se ha capturado la excepcin verificada
lanzada por el mtodo nuevoEmpleado. Para capturar la excepcin es utiliza la
construccin try / catch, de la siguiente forma:
Empresa em = new Empresa("La Mundial");
try {
em.nuevoEmpleado("Adn Primero",500);
} catch (CapacidadEmpresaExcedida exc) {
System.out.println(exc.toString());
System.exit(1);
}

Se encierra el cdigo que puede lanzar la excepcin en un bloque try /


catch.

A continuacin del catch se indica que tipo de excepcin se va a


capturar.

Despus del catch se escribe el cdigo que se ejecutar si se lanza la


excepcin.

Si no se lanza la excepcin el bloque catch no se ejecuta.

El formato general del bloque try / catch es:


try {
...
} catch (Clase_Excepcion nombre) { . . .}
catch (Clase_Excepcion nombre) { . . .}
...
Observese que se puede capturar ms de un tipo de excepcin declarando ms
de una sentencia catch. Tambin se puede capturar una excepcin genrica
(clase Exception) que engloba a todas las dems.
En ocasiones el cdigo que llama a un mtodo que dispara una excepcin
tampoco puede (o sabe) manejar esa excepcin. Si no sabe que hacer con ella
puede de nuevo lanzarla hacia arriba en la pila de llamada para que la gestione
quien le llamo (que a su vez puede capturarla o reenviarla). Cuando un mtodo
no tiene intencin de capturar la excepcin debe declararla metdiante la
clusula throws, tal como hemos visto en el mtodo que genera la excepcin.
Supongamos que, en nuestro ejemplo es el mtodo main de una clase el que
invoca el mtodo nuevoEmpleado. Si no quiere capturar la excepcin debe
hacer lo siguiente:
public static void main(String [] args) throws CapacidadEmpresaExcedida {
Empresa em = new Empresa("La Mundial");
em.nuevoEmpleado("Adn Primero",500);
}
Clusula finally
La clusula finally forma parte del bloque try / catch y sirve para especificar
un bloque de cdigo que se ejecutar tanto si se lanza la excepcin como si no.
Puede servir para limpieza del estado interno de los objetos afectados o para
liberar recursos externos (descriptores de fichero, por ejemplo). La sintaxis
global del bloque try / catch / finally es:

try {
...
} catch (Clase_Excepcion nombre) { . . .}
catch (Clase_Excepcion nombre) { . . .}
...
finally { . . .}

5.5. Creacin y manejo de excepciones creadas por el usuario

Las excepciones predefinidas cubren las situaciones de error ms habituales con las
que nos podemos encontrar, relacionadas con el propio lenguaje y el hardware. Cuando
se desarrollan aplicaciones existen otras situaciones de error de ms alto nivel
relacionadas con la funcionalidad de nuestros programas. Imaginemos una aplicacin
informtica que controla la utilizacin de los remontes de
una estacin de esqu: los pases de acceso a los remontes son personales e
intransferibles y dispondrn de un cdigo de barras que los identifica. Cada vez que un
usuario va a hacer uso de un remonte debe introducir su pase de acceso en una
mquina de validacin, que a cciona un torno y devuelve el pase.

El sistema puede constar de un ordenador central al que le llegan telemticamente los


datos correspondientes a los cdigos de barras de los pases que en cada momento se
estn introduciendo en cada mquina de validacin d e cada remonte; si un cdigo de
barras est en regla, el ordenador enva una orden de liberar el torno para permitir al
usuario acceder al remonte. El ordenador central habitualmente recibir cdigos
correctos utilizados en momentos adecuados, sin embargo, en ciertas ocasiones nos
encontraremos con situaciones anmalas:

1 Cdigo de barras ilegible


2 Cdigo de barras no vlido (por ejemplo correspondiente a un pase caducado)
3 Cdigo de barras utilizado en otro remonte en un periodo de tiempo demasiado
breve
4 etc.

DEFINICIN DE UNA EXCEPCIN DEFINIDA POR EL PROGRAMADOR.

En programacin orientada a objetos lo ms adecuado es que las excepciones sean


objetos, por lo que en Java definiremos las excepciones como clases. Nuestras clases

de excepcin, en general, heredarn de la clase Exception. En las clases que nos


creemos a partir de Exception, incluiremos al menos el constructor vaco y otro que
contenga un String como argumento. Este String se inicializa automticamente con el
nombre de la clase; la inicializacin se realiza en la superclase Throwable. El texto que
pongamos al hacer uso del segundo constructor se aadir al nombre de la clase
insertado por la superclase.

UTILIZACION DE UNA EXCEPCION DEFINIDA POR EL PROGRAMADOR

Una vez que disponemos de una excepcin propia, podremos programar la funcionalidad
de nuestras aplicaciones provocando (lanzando) la excepcin cuando detectemos
alguna de las situaciones anmalas asociadas.

En el siguiente ejemplo (ExPropiaClase) se presenta un mtodo (lnea 2) que levanta


( throw) la excepcin ExPropia cuando se lee un cero (lnea 4). La excepcin ExPropia
podra levantarse en diferentes secciones de cdigo de esta u otras clases. No
debemos olvidar indicar que nuestro mtodo es susceptible de lanzar la excepcin
(lnea 2).

1 public class ExPropiaClase {


2

public void Metodo() throws ExPropia {

if (Teclado.Lee_int() == 0)

throw new ExPropia();

// otros metodos

7 }

Finalmente, en clases de ms alto nivel podemos programar secciones de cdigo que


recojan la excepcin que hemos creado:

1 public class ExPropiaPrueba {


2

public static void main (String[] args) {

System.out.println("Hola");

do

try {

ExPropiaClase Instancia = new ExPropiaClase();

Instancia.Metodo();

catch(ExPropia e) {

10

System.out.println(e);

11

12

while(true);

13
14 }

También podría gustarte