Sei sulla pagina 1di 8

Tema 18-1 -Control de excepciones

El lenguaje Java tiene desde su origen vocacin de independencia del sistema


operativo y esto le supone perder parte del control sobre los perifricos que son la
fuente principal de errores o de situaciones inesperadas en la ejecucin de un
programa.
Para evitar estos problemas los diseadores del Java dotaron a ste de un
mecanismo de control de errores, creando el concepto de excepcin. Se denomina
excepcin a una situacin que no se puede resolver y que provoca la detencin del
programa.
Una excepcin se produce cuando durante la ejecucin de un programa se
realiza una operacin que provoca un error, por ejemplo una divisin por cero,
cuando queremos leer un nmero entero y el usuario teclea un texto, cuando se
accede a una posicin que no existe en un array, etc.
Todas las excepciones derivan de una clase denominada Throwable.
Cuando se produce un error se genera un objeto asociado a esa excepcin.
Este objeto es de la clase Exception o de alguna de sus herederas. Este objeto se
pasa al cdigo que se ha definido para manejar la excepcin.
La captura de excepciones en Java se efecta con la siguiente instruccin try-catch
(try significa intenta)
try {
Instrucciones que se van a ejecutar normalmente....;
}
catch(tipo1_de_excepcin e)
{
Instrucciones a ejecutar cuando ocurre una excepcin de tipo 1.
}
catch(tipo2_de_excepcin e)
{
Instrucciones a ejecutar cuando ocurre una excepcin de tipo 2.
}

catch(tipo3_de_excepcin e)
{
Instrucciones a ejecutar cuando ocurre una excepcin de tipo 3.
}

Adems, opcionalmente, se puede aadir al final de todos los catch la


clausula finally que contendr las sentencias que se ejecutarn siempre,
tanto si se produce una excepcin como si no. Si no hay excepcin, despus
de ejecutar las instrucciones de la clausula try se ejecutarn la de la
clausula finally. Si se produce un error en una de las instrucciones que hay
en la clausula try dejarn de ejecutarse el resto de instrucciones de esta
clausula y se buscar la captura de la excepcin que se haya producido y se
ejecutarn las instrucciones que se indiquen en ella, por ltimo se
ejecutarn las instrucciones de la clausula finally.
La siguiente tabla muestra las clases de excepciones frecuentes, derivadas de la
clase Exception.
Nombre de la clase

Situacin en la que se produce

ArithmeticException

En una operacin aritmtica p.e. divisin por cero

ArrayStoreException

Operacin en el uso de un array

NegativeArraySizeException

Operacin en el uso de un array

NullPointerException

Referencia a un objeto nulo

SecurityException

Excepcin en el sistema de seguridad

EOFException

Producida al llegar al final de un fichero

IOException

Producida en la entrada o salida de datos

FileNotFoundException

No encuentra el fichero

NumberFormatException

Producida en la conversin de cadena a un valor numrico

Vamos a realizar un ejercicio que pide el dividendo y el divisor, los leer


como cadenas y los transformar a enteros con el mtodo parseInt de la clase
Integer.
Por ltimo mostrar el cociente en pantalla. Si se produce un error en la
introduccin de los datos se mostrar un mensaje indicando la situacin y si se
produce un error en la operacin tambin los indicar. Para finalizar mostrar un
mensaje indicando que el programa ha finalizado.

Solucin.

Resultado de la ejecucin. Sin producir error.

Como vemos, el ltimo catch tiene el valor Exception que es genrico para
cuando se produce un error. Puedes probar a poner entre comentarios las dos
anteriores a sta, la del formato numrico y la de la operacin aritmtica y
comprobar cmo entonces se entrara por esta ltima captura general. Tambin
vemos, que lo que hay en finally siempre se ejecuta haya o no haya errores.
La filosofa de Java es del tipo interrupcin, pero se puede intentar emular
la reanudacin encerrando el bloque try en un while que se repetir hasta que el
error deje de existir. Ejemplo:
boolean indiceNoValido=true;
int i; //Entero que tomar nos aleatorios de 0 a 9
String texto[]={Uno,Dos,Tres,Cuatro,Cinco};
while(indiceNoValido){
try{
i=Math.round(Math.random()*9);
System.out.println(texto[i]);
indiceNoValido=false;
}catch(ArrayIndexOutOfBoundsException exc){
System.out.println(Fallo en el ndice);
}
}
En el cdigo anterior, el ndice i calcula un nmero del 0 al 9 y con ese
nmero el cdigo accede al array texto que slo contiene 5 elementos. Esto
producir muy a menudo una excepcin del tipo ArrayIndexOutOfBoundsException
que es manejada por el catch correspondiente. Normalmente no se continuara
intentando. Pero como tras el bloque catch est dentro del while, se har otro
intento y as hasta que no haya excepcin, lo que provocar que indiceNovalido
valga true y la salida, al fin, del while.
Se puede utilizar una serie de mtodos comunes a todas las clases de
excepciones:
1.-String getMessage(). Obtiene el mensaje descriptivo de la excepcin o una
indicacin especfica del error ocurrido:
try{
....
} catch (IOException ioe){
System.out.println(ioe.getMessage());
}

2.-void printStackTrace(). Escribe el mtodo y mensaje de la excepcin (la


llamada informacin de pila). El resultado es el mismo mensaje que muestra el
ejecutor (la mquina virtual de Java) cuando no se controla la excepcin.
Vamos a hacer un programa donde se captura una excepcin genrica por un
problema en la entrada de datos o por la divisin por cero.
Si se produce la excepcin se genera un objeto de la clase Exception que en
el ejemplo llamaremos excep, contiene informacin sobre el error producido. En el
bloque catch se muestra el error, hacemos de dos formas , usando los mtodos
anteriores o controlando nosotros la informacin del error
Impor tjava.util.Scanner;
Public cclass Excepcion1 {
Public static void main(String[] args) {
Scanner teclado=new Scanner(System.in);
int num1,num2;
boolean error=false;
do {
try{
error=false;
System.out.print("Ingrese primer valor:");
num1=teclado.nextInt();
System.out.print("Ingresesegundo valor");
num2=teclado.nextInt();
System.out.println("La divisin " + num1 +"/" +num2 + "= "

+num1/num2);

}
catch (Exception excep){
System.out.println(excep.getMessage());
excep.printStackTrace();
error=true;
}
finally {
teclado.nextLine(); //limpio buffer teclado
}
}while (error);
}//fin main
}// finclass

Al ejecutar el programa anterior y provocar la excepcin aparece:

/ by zero (es el resultado de excep.getMessage())


java.lang.ArithmeticException: / by zero
at ex.main(ex.java:16) (es el resultado de printStackTrace();)

Otra forma:
import java.util.Scanner;
public class ejemploexcepcion {
public static void main(String[] args) {
Scanner teclado=new Scanner(System.in);
int num1,num2;
boolean error=false;
do {
try{
error=false;
System.out.print("Ingrese primer valor:");
num1=teclado.nextInt();
System.out.print("Ingresesegundo valor");
num2=teclado.nextInt();
System.out.println("La divisin " + num1 +"/" +num2 + "= " +num1/num2);
}
catch (Exception excep){
System.out.println("division por cero");
error=true;
}
finally {
teclado.nextLine(); //limpio buffer teclado
}
}while (error);
}//fin main
}// finclass
Ahora vamos a ver cmo podemos capturar de forma selectiva con varios
bloques catch.
Import java.util.*;
Public class Excepcion2 {
/**
* @paramargs
*/
Public static void main(String[] args) {
Scanner teclado = newScanner(System.in);
boolean error=false;
do {

try {

System.out.print("Ingrese primer valor:");


String texto=teclado.nextLine();
int num1=Integer.parseInt(texto);
System.out.print("Ingrese segundo valor:");
texto=teclado.nextLine();

int num2=Integer.parseInt(texto);
System.out.println("La divisin " + num1 +"/" +num2 + "= "
+num1/num2);
}
catch (NumberFormatExceptionexcep){
System.out.println("Error en la conversin");
error=true;
}
catch (ArithmeticExceptionexcep){
System.out.println("Divisin por cero");
error=true;
}
catch (Exception excep){
System.out.println("Excepcin desconocida");
error=true;
}
finally {
teclado.nextLine(); //limpio buffer teclado
}
}while (error);
}//fin main
}//fin class
La sentencia throw permite al programador generar excepciones especficas
para la lgica de sus aplicaciones. La clase Persona muestra como el mtodo
ponEdad genera una excepcin cuando la edad es menor que cero o mayor de cien.
Cuando se genera la excepcin no se ejecuta la sentencia siguiente ya que el
mtodo termina con la generacin de la excepcin.
Public class Persona {
private int edad;
public void ponEdad(int edadNueva)throws Exception{
if (edadNueva< 0 || edadNueva> 100)
throw (newException ("Edad no vlida"));
edad=edadNueva;
}
public String toString(){
return"Edad: " + edad;
}
}
Import java.util.*;
Public class VerPersona {
Public static void main(String[] args) {
boolean error;
Scanner teclado = new Scanner(System.in);
Persona p = new Persona();

do {

error=false;
System.out.print("Introduce la edad: ");
try{
int edad = teclado.nextInt();
p.ponEdad(edad);
System.out.println(p.toString());
}
catch (Exception e){
error=true;
System.out.println(e.getMessage());
}
finally {
teclado.nextLine();
}
} while (error);

} // finmain
}// finclass
Ejercicios Propuestos (Por supuesto que se pueden hacer sin Excepciones,
pero...)

Realizar un programa que inicializa un array de String con los das de la


semana y le pediremos al usuario que nos indique un da del 1 (lunes) al 7
(domingo), si se sale de los lmites de nuestro array deberemos mostrar un
mensaje de error indicndolo. El programa terminar cuando el usuario teclee un
cero.
1.-

Resultado de la ejecucin:

2.- Realizar un ejercicio que pide al usuario una frase. Despus le pedir la posicin del
carcter que quiere visualizar y mostrar el pantalla el carcter de la frase tecleada que
se encuentra en esa posicin. Si la posicin no es vlida deber mostrar un mensaje
indicndolo. El programa terminar cuando el usuario introduzca la posicin 0.
Resultado de la ejecucin

Potrebbero piacerti anche