Sie sind auf Seite 1von 4

En esta entrada discutiremos los aspectos de las excepciones que fueron aadidas en Java SE6.

La
intencin de esta seccin es estar familiarizados con algnas de las excepciones mas comunes y errores
que encontraremos al programar en Java.

De donde vienen las Excepciones


Es importante saber lo que causa una excepcin o un error, y de donde vienen. Para este
propsito, vamos a definir 2 categoras de excepciones y errores:
Excepciones de la JVM: Estas escepciones o errores son exclusivamente o mas
lgicamente lanzadas por la JVM.
Excepciones Programticas: Estas excepciones son lanzadas explcitamente por la
aplicacin y/o programadores de una API.

Excepciones lanzadas por la JVM


Vamos a empezar con una ecepcin muy comn, llamada NullPointerException. Esta excepcin
ocurre cuando estamos intentando tener acceso a un objeto usando una variable de referencia
cuyo valor actual es null. No hay manera en la que el compilador pueda encontrarla antes de
tiempo de ejecucin. Vamos a echar un vistazo a lo siguiente:
1
class NPE {
2
static String s;
3
public static void main(String[] args){
4
System.out.println(s.length());
5
}
6}
7
Seguramente, el compilador pueda encontrar el problema con este pequeo programa. No, esto
va por tu cuenta. El codigo compilar bien, y la JVM lanzar una NullPointerException cuando
intenta invocar el mtodo length().
En la entrada anterior discutimos sobre el call stack o la pila de llamadas. Vamos a volver a
crear un ejemplo en el que el mtodo main() est en la parte de abajo de la pila, y este main()
invoca otro mtodo, que volver a llamar a otro mtodo, y as, la pila empieza a crecer hacia
arriba. Por supuesta el stack reside en la memoria, y incluso aunque nuestro OS nos d un
gigabyte de RAM para nuestro programa, hay una cantidad finita. Es posible que el stack crezca
tanto que el OS se quede sin espacio para almacenar la pila de llamadas. Cuando esto ocurra
tendremos un StackOverflowError. El mtodo mas comn para crear esto es crear un mtodo
recursivo. Un mtodo recursivo es un mtodo que se invoca as mismo en el cuerpo del mtodo.
Puede que suene un poco extrao, pero es una tcnica muy comn y muy til para cosas como
algoritmos de bsqueda o de ordenacin. Vamos a ver un ejemplo:
1 void go() {
2
go();
3}
4

Como podemos ver, si alguna vez cometemos el error de invocar el mtodo go(), nuestro
programa caer en un agujero negro: go() invoca a go() que invoca a go(), hasta que, sin
importar la memoria que tengamos, tendremos un StackOverflowError. De nuevo, la JVM solo
sabe cuando esto ocurrir, y ser la fuente de este error.

Excepciones lanzadas programticamente


Ahora vamos a ver excepciones lanzadas programticamente. Recordemos que hemos definido
programticamente como algo as:
Creado por el desarrollador de una API o una aplicacin.
Por ejemplo, algunas clases en la API de Java tienen mtodos que cogen un String como
argumento, y convierten este String en un primitivo numrico. Un buen ejemplo de estas clases
son las llamadas wrapper classes que vimos en una entrada anterior.
En algn momento, algn programador escribira mtodos como el parseInt() o valueOf(). Este
programador decidi sabiamente que si uno de estos mtodos reciba un String que no poda ser
convertido en un nmero, el mtodo debera lanzar un NumberFormatException. El cdigo
implementado parcialmente poda parecer a lo siguiente:
1
int parseInt(String s) throws NumberFormatException{
2
boolean parseSuccess = false;
3
int result = 0;
4
// Cosas complicadas de parseo
5
if (!parseSuccess) // Si el parseo ha fallado
6
throw new NumberFormatException();
7
return result;
8}
9

Otros ejemplos de excepciones programticas incluyen las AssertionError (aunque no es una


excepcin, es lanzada programticamente) y IllegalArgumentException. De hecho, nuestro
desarrollador mtico de la API podra haber usado IllegalArgumentException para el mtodo
parseInt(). El caso es que NumberFormatException hereda de IllegalArgumentException, y es
un poco mas precisa, por lo que en este caso, usar NumberFormatException soporta la nocin
que hemos discutido anteriormente: que cuando tenemos una jerarqua de excepciones,
usaremos la excepcin mas precisa que podamos.
Por supuesto, como discutimos antes, tambien podemos hacer nuestra propia y especial
excepcion, y lanzarla all donde queramos. Estas excepciones tambien caeran en la categora de
Excepciones lanzadas programticamente.
A continuacin vemos una tabla con las excepciones mas comunes:
Excepcion

Descripcion
Lanzado por
Es lanzada cuando intentamos acceder a un
ArrayIndexOutOfBoundsException array con un index invlido (menor que 0 o Por la JVM
mayor que la longitud del array).
Lanzado cuando intentamos hacer cast a una
ClassCastException
variable de referencia que no pasa el test IS- Por la JVM
A
Lanzado cuando un mtodo recibe un
IllegalArgumentException
argumento formateado de diferente manera Programticamente
del que el mtodo espera.
Lanzado cuando el estado del entorno no
coincide con la operacin que se intenta
IllegalStateException
Programticamente
llevar a cabo. (Usar un Scaner que no ha sido
cerrado)
Lanzado cuando intentamos acceder a un
NullPointerException
objeto con una variable de referencia cuyo Por la JVM
valor actual es null.
Lanzado cuando un mtodo convierte un
NumberFormatException
String a un nmero y ese String no puede ser Programticamente
convertido.
Lanzado cuando una sentencia que
AssertionError
Programticamente
comprueba un booleano devuelve false.
Lanzado cuando intentamos inicializar una
ExceptionInInitializerError
Por la JVM
variable static en un bloque de inicializacin.
Tpicamente lanzado cuando un mtodo es
StackOverflowError
muy recursivo y cada llamada se va
Por la JVM
aadiendo al stack.
Lanzado cuandl la JVM no puede encontrar
la clase que se necesita, porque hay un error
NoClassDefFoundError
en la linea de comandos, o un problema con Por la JVM
el classpath, o un archivo .class que no se
encuentra.

Das könnte Ihnen auch gefallen