You are on page 1of 14

Excepciones Try catch / Finally

TRATAMIENTO DE EXCEPCIONES
Bloques try catch - finally
Un programa que trate las excepciones debe realizar lo siguientes pasos:
1. Se intenta ( try ) ejecutar un bloque de cdigo.
2. Si se produce una circunstancia excepcional se lanza ( throw ) una excepcin. En
caso contrario el programa sigue su curso normal.
3. Si se ha lanzado una excepcin, la ejecucin del programa es desviada al manejador
de excepciones donde la excepcin se captura ( catch ) y se decide qu hacer al
respecto.
El esquema general en Java es:
try{
//Instrucciones que se intentan ejecutar, si se produce una
//situacin inesperada se lanza una excepcin
}
catch(tipoExcepcion e){
//Instrucciones para tratar esta excepcin
}
catch(otroTipoExcepcion e){
//Instrucciones para tratar esta excepcin
}
//Se pueden escribir tantos bloques catch como sean necesarios
finally{
// instrucciones que se ejecutarn siempre despus de un bloque try
// se haya producido o no una excepcin
}

Bloque try:
En el bloque try se encuentran las instrucciones que pueden lanzar una excepcin.
Solamente se pueden capturar las excepciones lanzadas dentro de un bloque try.
Una excepcin se puede lanzar de forma automtica o mediante la palabra reservada
throw.
Cuando se lanza la excepcin se transfiere la ejecucin del programa desde el punto
donde se lanza la excepcin a otro punto donde se captura la excepcin.
Bloque catch:
Es el bloque de cdigo donde se captura la excepcin. El bloque catch es el manejador
o handler de la excepcin. Aqu se decide qu hacer con la excepcin capturada. Puede
haber varios bloques catch relacionados con un bloque try.
Una vez finalizado un bloque catch la ejecucin no vuelve al punto donde se lanz la
excepcin. La ejecucin contina por la primera instruccin a continuacin de los
bloques catch.
Bloque finally:
Es opcional.
Debe aparecer a continuacin de los bloques catch.
Tambin puede aparecer a continuacin de un bloque try si no hay bloques catch.
La ejecucin de sus instrucciones queda garantizada independientemente de que el
bloque try acabe o no su ejecucin incluso en estos casos:

Aunque el bloque try tenga una sentencia return, continue o break, se ejecutar
el bloque finally
Cuando se haya lanzado una excepcin que ha sido capturada por un bloque
catch. El finally se ejecuta despus del catch correspondiente.
Si se ha lanzado una excepcin que no ha sido capturada, se ejecuta el finally
antes de acabar el programa.

Un bloque finally se usa para dejar un estado consistente despus de ejecutar el bloque
try.
Un ejemplo de uso de bloques finally puede ser cuando estamos tratando con ficheros y
se produce una excepcin. Podemos escribir un bloque finally para cerrar el fichero.
Este bloque se ejecutar siempre y se liberarn los recursos ocupados por el fichero.
Ejemplo de tratamiento de excepciones:
El siguiente programa lee un nmero entero y lo muestra. Si en la instruccin
sc.nextInt() se introduce un nmero de otro tipo o un carcter, se lanza una excepcin
InputMismatchException que es capturada por el bloque catch. En este bloque se
realizan las instrucciones necesarias para resolver la situacin y que el programa pueda
continuar.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
do{
try{
System.out.print("Introduce un nmero entero > 0: ");
n = sc.nextInt();
System.out.println("Nmero introducido: " + n);
}catch(InputMismatchException e){
sc.nextLine();
n = 0;
System.out.println("Debe introducir un nmero entero " + e.toString());
}
}while(n<=0);
}
Ejemplo de tratamiento de excepciones: Excepcin lanzada en un mtodo y tratada en
el que mtodo que lo ha llamado.
La salida del programa es:
4
2
6
Ha intentado acceder a una posicin fuera del array
CAPTURAR EXCEPCIONES
Un bloque try puede estar seguido de varios bloques catch, tantos como excepciones
diferentes queramos manejar.
La estructura y el comportamiento de un bloque catch son similares al de un mtodo.
La excepcin es capturada por el bloque catch cuyo argumento coincida con el tipo
de objeto lanzado.
La bsqueda de coincidencia se realiza sucesivamente sobre los bloques catch en el
orden en que aparecen en el cdigo hasta que aparece la primera concordancia.
Cuando acaba la ejecucin de este bloque, el programa contina despus del ltimo de
los cach que sigan al bloque try que lanz la excepcin.
Ejemplo de tratamiento de excepciones con varios catch:
En este programa se controla el error producido si se introduce un dato no entero y si se
intenta acceder a una posicin fuera del array.
THROWS

throw

La sentencia throw se utiliza para lanzar explcitamente una excepcin. En primer lugar
se debe obtener un descriptor de un objeto Throwable, bien mediante un parmetro en
una clusula catch o, se puede crear utilizando el operador new. La forma general de la
sentencia throw es:

throw ObjetoThrowable;

El flujo de la ejecucin se detiene inmediatamente despus de la sentencia throw, y


nunca se llega a la sentencia siguiente. Se inspecciona el bloque try que la engloba ms
cercano, para ver si tiene la clusula catch cuyo tipo coincide con el del objeto o
instancia Thorwable. Si se encuentra, el control se transfiere a ese sentencia. Si no, se
inspecciona el siguiente bloque try que la engloba, y as sucesivamente, hasta que el
gestor de excepciones ms externo detiene el programa y saca por pantalla el trazado de
lo que hay en la pila hasta que se alcanz la sentencia throw. En el programa siguiente,
java905.java, se demuestra como se hace el lanzamiento de una nueva instancia de una
excepcin, y tambin cmo dentro del gestor se vuelve a lanzar la misma excepcin al
gestor ms externo.

class java905 {
static void demoproc() {
try {
throw new NullPointerException( "demo" );
} catch( NullPointerException e ) {
System.out.println( "Capturada la excepcion en demoproc" );
throw e;
}
}

public static void main( String args[] ) {


try {
demoproc();
} catch( NullPointerException e ) {
System.out.println( "Capturada de nuevo: " + e );
}
}
}

Este ejemplo dispone de dos oportunidades para tratar el mismo error. Primero, main()
establece un contexto de excepcin y despus se llama al mtodo demoproc(), que
establece otro contexto de gestin de excepciones y lanza inmediatamente una nueva
instancia de la excepcin. Esta excepcin se captura en la lnea siguiente. La salida que
se obtiene tras la ejecucin de esta aplicacin es la que se reproduce:

% java java905
Capturada la excepcion en demoproc
Capturada de nuevo: java.lang.NullPointerException: demo

throws

Si un mtodo es capaz de provocar una excepcin que no maneja l mismo, debera


especificar este comportamiento, para que todos los mtodos que lo llamen puedan
colocar protecciones frente a esa excepcin. La palabra clave throws se utiliza para
identificar la lista posible de excepciones que un mtodo puede lanzar. Para la mayora
de las subclase de la clase Exception, el compilador Java obliga a declarar qu tipos
podr lanzar un mtodo. Si el tipo de excepcin es Error o RuntimeException, o
cualquiera de sus subclases, no se aplica esta regla, dado que no se espera que se
produzcan como resultado del funcionamiento normal del programa. Si un mtodo lanza
explcitamente una instancia de Exception o de sus subclases, a excepcin de la
excepcin de runtime, se debe declarar su tipo con la sentencia throws. La declaracin
del mtodo sigue ahora la sintaxis siguiente:

type NombreMetodo( argumentos ) throws excepciones { }

En el ejemplo siguiente, java906.java, el programa intenta lanzar una excepcin sin


tener cdigo para capturarla, y tampoco utiliza throws para declarar que se lanza esta
excepcin. Por tanto, el cdigo no ser posible compilarlo.

class java906 {
static void demoproc() {
System.out.println( "Capturada la excepcion en demoproc" );
throw new IllegalAccessException( "demo" );
}
}

public static void main( String args[] ) {


demoproc();
}

El error de compilacin que se produce es lo suficientemente explcito:

% javac java906.java
java906.java:30: Exception java.lang.IllegalAccessException must be caught, or
it must be declared in the throws clause of this method.
throw new IllegalAccessException( "demo" );
^

Para hacer que este cdigo compile, se convierte en el ejemplo siguiente, java907.java,
en donde se declara que el mtodo puede lanzar una excepcin de acceso ilegal, con lo
que el problema asciende un nivel ms en la jerarqua de llamadas. Ahora main() llama
a demoproc(), que se ha declarado que lanza una IllegalAccessException, por lo tanto
colocamos un bloque try que pueda capturar esa excepcin.

class java907 {
static void demoproc() throws IllegalAccessException {
System.out.println( "Dentro de demoproc" );
throw new IllegalAccessException( "demo" );
}

public static void main( String args[] ) {


try {
demoproc();
} catch( IllegalAccessException e ) {
System.out.println( "Capturada de nuevo: " + e );
}
}
}

CLASE STRING Y OPERACIONES CON CADENA

Informacin bsica de la cadena

.length() Nos devuelve el tamao que tiene la cadena.

char charAt(int index) Devuelve el carcter indicado como ndice. El primer carcter
de la cadena ser el del ndice 0. Junto con el mtodo .length() podemos recuperar todos
los caracteres de la cadena de texto. Hay que tener cuidado. Ya que si intentamos
acceder a un ndice de carcter que no existe nos devolver una excepcin
IndexOutOfBoundsException.
Comparacin de Cadenas

Los mtodos de comparacin nos sirven para comparar si dos cadenas de texto son
iguales o no. Dentro de los mtodos de comparacin tenemos los siguientes:

boolean equals(Object anObject) Nos permite comparar si dos cadenas de texto son
iguales. En el caso de que sean iguales devolver como valor true. En caso contrario
devolver false. Este mtodo tiene en cuenta si los caracteres van en maysculas o en
minsculas. Si queremos omitir esta validacin tenemos dos opciones. La primera es
convertir las cadenas a maysculas o minsculas con los mtodos .toUpperCase() y
.toLowerCase() respectivamente. Mtodos que veremos ms adelante. La segunda
opcin es utilizar el mtodo equalsIgnoreCase() que omite si el carcter est en
maysculas o en minsculas.

boolean equalsIgnoreCase(String anotherString) Compara dos cadenas de caracteres


omitiendo si los caracteres estn en maysculas o en minsculas.

int compareTo(String anotherString) Este mtodo es un poco ms avanzado que el


anterior, el cual, solo nos indicaba si las cadenas eran iguales o diferentes En este caso
compara a las cadenas lxicamente. Para ello se basa en el valor Unicode de los
caracteres. Se devuelve un entero menor de 0 si la cadena sobre la que se parte es
lxicamente menor que la cadena pasada como argumento. Si las dos cadenas son
iguales lxicamente se devuelve un 0. Si la cadena es mayor que la pasada como
argumento se devuelve un nmero entero positivo. Pero que es esto de mayor, menor o
igual lxicamente. Para describirlo lo veremos con un pequeo ejemplo.

s1 = "Cuervo"
s2 = "Cuenca"
s1.compareTo(s2);

Compararamos las dos cadenas. Los tres primeros caracteres son iguales Cue.
Cuando el mtodo llega al 4 carcter tiene que validar entre la r minscula y la n
minscula. Si utiliza el cdigo Unicode llegar a la siguiente conclusin.

r (114) > n(110)

Y nos devolver la resta de sus valores. En este caso un 4. Hay que tener cuidado,
porque este mtodo no tiene en cuenta las maysculas y minsculas. Y dichos
caracteres, an siendo iguales, tienen diferentes cdigo. Veamos la siguiente
comparacin

s1 = "CueRvo"
s2 = "Cuervo"
s1.compareTo(s2);

Nuevamente los tres caracteres iniciales son iguales. Pero el cuarto es distinto. Por un
lado tenemos la r minscula y por otro la r mayscula. As:

R(82) < r(114)


Qu entero nos devolver el mtodo compareTo()? -32?

int compareToIgnoreCase(String str) Este mtodo se comportar igual que el


anterior. Pero ignorando las maysculas. Todo un alivio por si se nos escapa algn

carcter en maysculas Otros mtodos para la comparacin de cadenas son:

boolean regionMatch( int thisoffset,String s2,int s2offset,int len );


boolean regionMatch( boolean ignoreCase,int thisoffset,String s2, int s2offset,int 1 );
Bsqueda de caracteres

Tenemos un conjunto de mtodos que nos permiten buscar caracteres dentro de cadenas
de texto. Y es que no nos debemos de olvidar que la cadena de caracteres no es ms que
eso: una suma de caracteres.

int indexOf(int ch) Nos devuelve la posicin de un carcter dentro de la cadena de


texto. En el caso de que el carcter buscado no exista nos devolver un -1. Si lo
encuentra nos devuelve un nmero entero con la posicin que ocupa en la cadena.

int indexOf(int ch, int fromIndex) Realiza la misma operacin que el anterior mtodo,
pero en vez de hacerlo a lo largo de toda la cadena lo hace desde el ndice (fromIndex)
que le indiquemos.

int lastIndexOf(int ch) Nos indica cual es la ltima posicin que ocupa un carcter
dentro de una cadena. Si el carcter no est en la cadena devuelve un -1. int
lastIndexOf(int ch, int fromIndex) Lo mismo que el anterior, pero a partir de una
posicin indicada como argumento.

Bsqueda de subcadenas

Este conjunto de mtodos son, probablemente, los ms utilizados para el manejo de


cadenas de caracteres. Ya que nos permiten buscar cadenas dentro de cadenas, as como
saber la posicin donde se encuentran en la cadena origen para poder acceder a la
subcadena. Dentro de este conjunto encontramos:

int indexOf(String str) Busca una cadena dentro de la cadena origen. Devuelve un
entero con el ndice a partir del cual est la cadena localizada. Si no encuentra la cadena
devuelve un -1.

int indexOf(String str, int fromIndex) Misma funcionalidad que indexOf(String str),
pero a partir de un ndice indicado como argumento del mtodo.

int lastIndexOf(String str) Si la cadena que buscamos se repite varias veces en la


cadena origen podemos utilizar este mtodo que nos indicar el ndice donde empieza la
ltima repeticin de la cadena buscada.

lastIndexOf(String str, int fromIndex) Lo mismo que el anterior, pero a partir de un


ndice pasado como argumento.
boolean startsWith(String prefix) Probablemente mucha gente se haya encontrado
con este problema. El de saber si una cadena de texto empieza con un texto especfico.
La verdad es que este mtodo poda obviarse y utilizarse el indexOf(), con el cual, en el
caso de que nos devolviese un 0, sabramos que es el inicio de la cadena.

boolean startsWith(String prefix, int toffset) Ms elaborado que el anterior, y quizs,


y a mi entender con un poco menos de significado que el anterior.

boolean endsWith(String suffix) Y si alguien se ha visto con la necesidad de saber si


una cadena empieza por un determinado texto, no va a ser menos el que se haya
preguntado si la cadena de texto acaba con otra. De igual manera que suceda con el
mtodo startsWith() podramos utilizar una mezcla entre los mtodos .indexOf() y
.length() para reproducir el comportamiento de .endsWith(). Pero las cosas, cuanto ms
sencillas, doblemente mejores.

Mtodos con subcadenas

Ahora que sabemos como localizar una cadena dentro de otra seguro que nos acucia la
necesidad de saber como substraerla de donde est. Si es que no nos podemos estar
quietos

String substring(int beginIndex) Este mtodo nos devolver la cadena que se


encuentra entre el ndice pasado como argumento (beginIndex) hasta el final de la
cadena origen. As, si tenemos la siguiente cadena:

String s = "Vctor Cuervo"

El mtodo

s.substring(7)

Nos devolver Cuervo.

String substring(int beginIndex, int endIndex) Si se da el caso que la cadena que


queramos recuperar no llega hasta el final de la cadena origen, que ser lo normal,
podemos utilizar este mtodo indicando el ndice inicial y final del cual queremos
obtener la cadena. As, si partimos de la cadena

String s = "En un lugar de la mancha...."

El mtodo

s.substring(6,11)

Nos devolver la palabra lugar.

Hay que tener especial cuidado ya que es un error muy comn el poner como ndice
final el ndice del carcter ltimo de la palabra a extraer. Cuando realmente es el ndice
+ 1 de lo que queramos obtener.
Manejo de caracteres

Otro conjunto de mtodos que nos permite jugar con los caracteres de la cadena de
texto. Para ponerles en maysculas, minsculas, quitarles los espacios en blanco,
reemplazar caracteres,.

String toLowerCase(); Convierte todos los caracteres en minsculas.

String toUpperCase(); Convierte todos los caracteres a maysculas.

String trim(); Elimina los espacios en blanco de la cadena.

String replace(char oldChar, char newChar) Este mtodo lo utilizaremos cuando lo


que queramos hacer sea el remplazar un carcter por otro. Se reemplazarn todos los
caracteres encontrados.

Conversin a String: valueOf()

Un potente conjunto de mtodos de la clase String nos permite convertir a cadena


cualquier tipo de dato bsico: int, float, double, Esto es especialmente til cuando
hablamos de nmeros. Ya que en mltiples ocasiones querremos mostrarles como
cadenas de texto y no en su representacin normal de nmero. As podemos utilizar los
siguientes mtodos:

String valueOf(boolean b);


String valueOf(int i);
String valueOf(long l);
String valueOf(float f);
String valueOf(double d);
String valueOf(Object obj);

Clase Math y operaciones numricas

amos a comentar alfabticamente las ms importantes y luego veremos un ejemplo de


su uso:

Funcin Significado
abs() Valor absoluto
acos() Arcocoseno
asin() Arcoseno
atan() Arcotangente entre -PI/2 y PI/2
atan2( , ) Arcotangente entre -PI y PI
ceil() Entero mayor ms cercano
cos(double) Coseno
exp() Exponencial
floor() Entero menor ms cercano
log() Logaritmo natural (base e)
max( , ) Mximo de dos valores
min( , ) Mnimo de dos valores
pow( , ) Primer nmero elevado al segundo
random() Nmero aleatorio (al azar) entre 0.0 y 1.0
rint(double) Entero ms prximo
round() Entero ms cercano (redondeo de la forma
habitual)
sin(double) sin(double)
sqrt() Raz cuadrada
tan(double) Tangente
toDegrees(double) Pasa de radianes a grados (a partir de Java 2)
toRadians() Pasa de grados a radianes (a partir de Java 2)

Tambin hay disponibles dos constantes: PI (relacin entre el dimetro de una


circunferencia y su longitud) y E (base de los logaritmos naturales).

Las funciones trigonomtricas (seno, coseno, tangente, etc) miden en radianes, no en


grados, de modo que ms de una vez deberemos usar "toRadians" y "toDegrees" si nos
resulta ms cmodo pensar en grados.

Y un ejemplo, agrupando estas funciones por categoras, sera:

// Matem.java
// Ejemplo de matemticas desde Java
// Introduccin a Java, Nacho Cabanes

class Matem {

public static void main( String args[] ) {

System.out.print( "2+3 es ");


System.out.println( 2+3 );
System.out.print( "2*3 es ");
System.out.println( 2*3 );
System.out.print( "2-3 es ");
System.out.println( 2-3 );
System.out.print( "3/2 es ");
System.out.println( 3/2 );
System.out.print( "3,0/2 es ");
System.out.println( 3.0/2 );
System.out.print( "El resto de dividir 13 entre 4 es ");
System.out.println( 13%4 );
System.out.print( "Un nmero al azar entre 0 y 1: ");
System.out.println( Math.random() );
System.out.print( "Un nmero al azar entre 50 y 150: ");
System.out.println( (int)(Math.random()*100+50) );
System.out.print( "Una letra minscula al azar: ");
System.out.println( (char)(Math.random()*26+'a') );

System.out.print( "Coseno de PI radianes: ");


System.out.println( Math.cos(Math.PI) );
System.out.print( "Seno de 45 grados: ");
System.out.println( Math.sin(Math.toRadians(45)) );
System.out.print( "Arco cuya tangente es 1: ");
System.out.println( Math.toDegrees(Math.atan(1)) );

System.out.print( "Raz cuadrada de 36: ");


System.out.println( Math.sqrt(36) );
System.out.print( "Cinco elevado al cubo: ");
System.out.println( Math.pow(5.0,3.0) );
System.out.print( "Exponencial de 2: ");
System.out.println( Math.exp(2) );
System.out.print( "Logaritmo de 2,71828: ");
System.out.println( Math.log(2.71828) );

System.out.print( "Mayor valor entre 2 y 3: ");


System.out.println( Math.max(2,3) );
System.out.print( "Valor absoluto de -4,5: ");
System.out.println( Math.abs(-4.5) );
System.out.print( "Menor entero ms cercano a -4,5: ");
System.out.println( Math.floor(-4.5) );
System.out.print( "Mayor entero ms cercano a -4,5: ");
System.out.println( Math.ceil(-4.5) );
System.out.print( "Redondeando -4,5 con ROUND: ");
System.out.println( Math.round(-4.5) );
System.out.print( "Redondeando 4,5 con ROUND: ");
System.out.println( Math.round(4.5) );
System.out.print( "Redondeando -4,6 con RINT: ");
System.out.println( Math.rint(-4.6) );
System.out.print( "Redondeando -4,5 con RINT: ");
System.out.println( Math.rint(4.5) );
}
}

Clase calendar y Gregorian calendar

Lo primero es importar la clase Calendar.

import java.util.Calendar;

Tenemos dos maneras de crear un objeto calendar:


Calendar fecha1 = Calendar.getInstance();
fecha1.set(2016, 6, 3);
Calendar fecha2 = new GregorianCalendar(2016,7,5);

La primera forma es usando Calendar.getInstance(). Importante, no podemos hacer new


Calendar(); al ser una clase abstracta.

Despues de crearlo, usamos el mtodo set para fijar los valores que queremos, ao, mes
y dia.

La segunda forma es usando otra clase llamada GregorianCalendar que es hija de


Calendar, que si podemos hacer un new GregorianCalendar. Para importar la clase
GregorianCalendar, necesitamos importarla.

import java.util.GregorianCalendar;

Tambin podemos aadir la hora, minuto y segundo en los parmetros.

Para mostrar la fecha como hacamos con Date, necesitamos usar el mtodo getTime().

Calendar fecha1 = Calendar.getInstance();


fecha1.set(2016, 6, 3, 10, 5, 6);
System.out.println(fecha1.getTime());

Veremos esto:

En Calendar, podemos modificar cada elemento de la siguiente forma:

Calendar fecha1 = Calendar.getInstance();


fecha1.set(Calendar.YEAR, 2014);
fecha1.set(Calendar.MONTH, 10);
fecha1.set(Calendar.DATE, 20);

Simplemente, necesitamos indicar que campo se debe modificar (ao, mes, dia, etc) y el
valor a modificar. Para el campo, necesitamos usar las constantes de Calendar, puedes
verlas en la API.

Tambin podemos mostrar campos concretos con el campo get.

Calendar fecha1 = Calendar.getInstance();

fecha1.set(Calendar.YEAR, 2014);
fecha1.set(Calendar.MONTH, 10);
fecha1.set(Calendar.DATE, 20);
System.out.println("Ao: "+fecha1.get(Calendar.YEAR));
System.out.println("Mes: "+fecha1.get(Calendar.MONTH));
System.out.println("Dia: "+fecha1.get(Calendar.DATE));
System.out.println(fecha1.getTime());

Esto es lo que vemos:

Tener en cuenta que los meses empiezan en 0, por lo que el mes 10 es noviembre.

Podemos aadir das, meses, aos, horas, etc a una fecha en concreto. Para ello,
debemos usar el mtodo add, indicamos el campo a aadir y la cantidad que le
aadimos. Por ejemplo:

Calendar fecha1 = Calendar.getInstance();


System.out.println("Fecha de hoy: "+fecha1.getTime());
fecha1.add(Calendar.DATE, 2);
System.out.println("Fecha 2 dias mas: "+fecha1.getTime());

Tambin podemos restarle si el nmero es negativo.

En Calendar tambin, podemos usar los mtodos before y after de la clase Date.

Esto nos indica si una fecha esta despus o antes que otra.

System.out.println(fecha1.after(fecha2));
System.out.println(fecha1.before(fecha2));

Por ltimo, tenemos el mtodo roll, que tiene un funcionamiento curioso. Simplemente,
es como add, solo que cuando un campo llega la limite no se modifica los otros. Por
ejemplo, si aumentamos 22 dias a una fecha y esta llega a mas de 31, el mes no
aumentar.

Calendar fecha1 = Calendar.getInstance();


System.out.println("Fecha de hoy: "+fecha1.getTime());
fecha1.roll(Calendar.DATE, 28);
System.out.println("Fecha aadiendo 28 dias: "+fecha1.getTime());

You might also like