Está en la página 1de 5

Excepciones

Definicin
Una excepcin que no fue capturada correctamente hace que el sistema se
caiga. Una excepcin es un evento que ocurre durante la ejecucin de un programa, que
interrumpe el flujo normal de ejecucin.
Java usa excepciones para el manejo de errores, error handling. Es un sinnimo
de eventos excepcionales. Un buen manejo de Excepciones hace a un sistema robusto y
estable, confiable.

Bloque try, catch y finally


Dentro del bloque try se pondr todo el cdigo que puede arrojar alguna
excepcin. Los bloques catch son los encargados de atrapar las excepciones arrojadas
por alguna sentencia del bloque try. El bloque finally se ejecuta siempre despus del try y
del catch, haya habido o no lanzada una excepcion.
Ejemplo:
try {
....
}
catch (ArrayIndexOutOfBoundsException aioobe) {
....
}
catch(Exception e){
....
}
finally{
....//Limpieza de codigo
}

Tipos de Excepciones
-Excepciones No Chequeadas (Unchecked Exceptions)
Son las excepciones que tienen como superclase a la clase RuntimeException.
No hay necesidad de capturarlas, es decir que no se necesita utilizar el bloque try/catch,
pero al saltar uan excepcin de este tipo, como todas las excepciones corta el flujo de la
ejecucin.
Pueden ser difciles de detectar, pero finalmente hacen que el sistema se caiga
si no fueron tomadas en cuenta.
Ejemplo:
Cuando se realiza una divisin por cero se lanza automticamente una
ArithmeticException. Cuando se quiere acceder a un objeto que apunta a null se lanza
automticamente una NullPointerException. Cuando se quiere acceder a un array con un

ndice que es mayor al tamao del array, se lanza automticamente una


ArrayIndexOutOfBoundException.
En java:
int unValor = 0; //Este valor se suponia que no podia ser Cero pero
en algun momento se convirtio en Cero
try{
int resultado = 10 / unValor;
}catch(ArithmeticException ae){
//Ac tengo el control del flujo por el error de dividir por
cero, asi informo al usuario que hubo un error.
}finally{
//Y finalmente continuo con el sistema, reestableciendo el
control.
}
-Execpciones Chqueadas(Checked Exceptions)
Son las excepciones que tienen como superclase a la clase Exception.
Necesitan ser capturadas, caso contrario no se podr compilar el cdigo.
En el caso del FileReader se esta accediendo a lo que se llama un recurso
externo al sistema en si. El sistema consta de las variables, las clases, los packages y los
mtodos que definimos, pero un archivo es un recurso externo, es decir que puede no
existir al momento de ejecutar nuestro programa, ose borrado mientras nuestro
programa esta funcionando.
Tambin llamamos recurso externo a una conexin con la base de datos,
porque depende de una conexin de red. Todos estos artefactos que no son parte del
programa sino que se interacta con ellos, pueden traer algunas complicaciones como,
no existir, que la red no esta conectada, que no haya mas espacio en disco, que la red se
caiga en medio de una corrida del programa.
Todos estos motivos llevan a la necesidad de evaluar si se pueden realizar
correcta y completamente las instrucciones del programa. Por lo tanto si algo sale mal, lo
que no puede ocurrir es que dejemos una conexin tomada, o un archivo sin que otro
sistema pueda acceder a el.
Aqu es donde tenemos que prestar mucha atencin para que nuestro sistema
no traiga problemas, simplemente verificar en el finally que se han liberado los recursos.
Ejemplo:
La clase FileReader se utiliza para el acceso al disco. Cuando utilizo un acceso a
disco con mtodos de la clase FileReader, debo capturar la excepcin IOException.
En java:
FileReader archivoALeer = null;
String nombreDelArchivoEnAcceso = archivo.txt;
try{
archivoALeer = FileReader(new File
(nombreDelArchivoEnAcceso));
//Ac intento hacer lo que tenga que hacer con el archivo
}catch(IOException ioe){

//Ac informo que ocurri un error de acceso al recurso


externo.
}finally{
if (archivoALeer != null){
try{
archivoALeer.close();
}catch (Exception e){
}
}
}

La sentencia throw

La sentencia throw se usa para lanzar excepciones. Requiere un nico argumento, una
instancia de la clase java.lang.Throwable, que es implementada por la clase Exception y
errores.
Ejemplo:
boolean hayError = true;
if(hayError) {
throw new Exception();
}
Esto significa que despus de evaluar la clausula hayError y al ver que es verdadero,
significa que debe cortarse el flujo de corrida del programa, y desde el mtodo que llama
a este mtodo debe capturarse este error con un bloque try/catch, e informar al usuario
que ocurri el error y luego restablecer el sistema.

Creacion de excepciones propias


Por convencin su nombre debera terminar con la palabra Exception. Consiste en
crear una clase que hereda de java.langException. Lo conveniente es ir identificando que
tipo de excepciones, en el flujo de informacin de la vida real, pueden ser representadas
por una excepcin creada a medida, de forma tal de poder entender de forma inmediata
un bloque de cdigo.
El manejo de excepciones hace que el cdigo sea legible y fcilmente comprensible.
Ejemplo:
public class MiExepcionException extends Exception{
//Ac va la definicin de la clase.
}

La keyword Throws
La palabra clave throws se utiliza en la firma de los mtodos que pueden lanzar
excepciones. Una buena combinacin de Creacin de Excepciones propias del negocio
que estamos modelando con el sistema, y la declaracin en los mtodos indicados que
pueden lanzar este tipo de excepciones, hace que sea fcil programar y compartir clases
entre distintos equipos de desarrollo.
Estas practicas facilitan mucho el compartir cdigo y queda uno siempre obligado a
capturar excepciones que permiten un buen control del flujo de datos dentro del sistema,

y lo hacen robusto.
Ejemplo:
public class Hombre{
public void comer () throws MiExcepcion{
//Ac va algo de cdigo.
//Ac debemos evaluar una condicin que hace que arrojemos una
excepcin.
throw new MiExcepcion();
}
}
Ejemplo Completo de todo lo anterior
class NumeroNegativoException extends Exception {
NumeroNegativoException(){
super("El numero debe ser mayor o igual que 0");
}
}
static long Factorial(int n) throws NumeroNegativoException{
if(n<=0) throw new NumeroNegativoException();
int f=1;
for(int i=1;i<=n;i++) f*=i;
return f;
}
public static void main(String args[]){
int i;
BufferedReader entrada = new BufferedReader(
new InputStreamReader(System.in));
String s = new String();
try{
s=entrada.readLine();
//Convertir la entrada en entero
i = Integer.parseInt(s);
System.out.println("Factorial de " + i + ": " + Factorial(i));
} catch(NumeroNegativoException nne){
//Mostrara "El numero debe ser mayor o igual que 0"
System.err.println(nne.getMessage());
} catch(IOException ioe){
System.err.println("Se ha producido un error en la entrada de datos");

} catch(NumberFormatException nfe){
//Se lanza cuando la cadena s no se puede convertir a entero
System.err.println("Formato erroneo");
}catch(Exception e){
System.err.println("Se ha producido un error");
}
}
}

También podría gustarte