feb 27 2010
Apuntes de Java: Manejo de Excepciones
El manejo de excepciones es una de la características que mas robusto hace al lenguaje de programación java. Claro, que esto viene de su papá C++ y creo que actualmente también lo implementan lenguajes como Visual Basic.
Bueno, últimamente ando programando en java, c y c++, simultáneamente. Así que a veces se me cruzan los cables con ambos lenguajes. Lo que voy a postear ahora son errores que -creo yo- son comunes a la hora del manejo de excepciones, ya que cuando andaba programando, se me fueron esas nociones de las excepciones.
En realidad, tengo solo dos apuntes que hacer.
La primera: Tener cuidado con el NullPointerException y de como estas están programadas en la API del J2SE.
- Como sabemos, la excepción NullPointerException es “tirada” cuando un objeto apunta a nulo (si queremos verlo desde el punto de vista de punteros de C).
- Ahora, veamos un ejemplo de como funciona esto en el siguiente método.
public static String evaluarString(String s) throws NullPointerException
{
System.out.println("Antes");
if(s==null)
throw new NullPointerException();
System.out.println("Despues");
return s;
}
- Generalmente los métodos que tiran Excepciones están implementadas así como la anterior. Si se fijan en C usualmente tendríamos que colocar la parte de if(s==null) para comprobar que el puntero no sea nulo, pero en java eso es implementado en las excepciones propensas a error. Otra cosa, hay excepciones que el compilador te pide que captures antes de ejecutarlas, este no es el caso de NullPointerException, pero si de otras como IOException o InterruptedException, etc..
- Si vamos a querer llamar ese método en el main(), tenemos que ponerlo dentro de un try…catch() si no queremos que se vea interrumpido el programa.
- Ahora si, lo q pasó en mi caso. Yo dije, “pa’ no abusar del manejo de excepciones y como se cuando se produce, voy a validarlo mejor con un if(variable==null)”, pero ERROR!!!, ya que si vemos la implementación del método este ya hace eso, además si detecta que es null, el programa se interrumpirá automáticamente antes de llegar al return.
- Visualmente si ponemos esto en el main:
String c = evaluarString(s);
if(c==null)
System.out.println("HolaMundo");
- Pasará esto:
Antes Exception in thread "main" java.lang.NullPointerException at EjemploLecturaEscrituraXML.evaluarString(EjemploLecturaEscrituraXML.j ava:33) at EjemploLecturaEscrituraXML.main(EjemploLecturaEscrituraXML.java:52)
- Como vemos imprimió el “Antes”, pero no imprimió el “HolaMundo” ni el ”“Después”, ya que la excepción fue tirada antes y nadie la capturó. Sin embargo, esto se soluciona rápidamente con un try…catch().
La segunda: Tener cuidado con el manejo de excepciones cuando se usan dentro de bucles.
- Cuando estoy programando y ya me estoy muriendo de sueño y veo que en la ejecución se tiró una excepción, se me da inmediatamente por poner un try…catch que engloba mucho mas de las líneas propensas a excepción. Esto producira que nuestro programa ya no se detenga, pero sin embargo hay que tener cuidado la linea propensa de excepcion esta dentro de un bucle como:
String s[] = new String[5];
s[0] = "Hola";
s[1] = "Hola";
s[2] = "Hola";
s[4] = "Hola";
for(int i=0; i<s.length; i++)
{
System.out.println(s[i].toString());
}
- Si ejecutamos eso en un main(), nos botará una excepción justo en la línea de System.out.println(s[i].toString()). Ahora, a primera vista yo pondria un try que empezaría antes del for(…) y terminaría después del for con el catch(), pero eso es un ERROR (si es que ya te diste cuenta porque mejor pásate al final del post =P), ya que cuando se produzca la excepción, ésta irá justo a las sentencias dentro del catch(), lo cual interrumpirá el bucle. Por lo tanto, lo recomendable es poner el try catch, dentro del bucle para que así, simplemente obvie el NullPointerException y luego siga la ejecución del bucle.
Para finalizar el post, el tema de manejos de excepciones es lo que mas me gusta de java, ya que cuando hay un error, el programa claro que se cuelga, pero en consola es mostrado el error que se produjo, la línea en donde se produjo, y el método donde fue tirado esa excepción. A veces cuando programo en C, tengo errores (generalmente por punteros descarriados) y cuando el programa se cuelga, este me dice que se produjo un error, pero no me dice donde se produjo. Por eso es que C es un poco mas hardcore =P.




