Como lidiar con NullPointerException

Bueno, después de experimentar varios problemas de este tipo:

run:
Exception in thread “main” java.lang.NullPointerException
at package.Class.main(Class.java:24)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)

Me decidí a buscar un método (Debería decir metología, porque esto es algo que tiene mucho que ver con buenas costumbres de programación) para evitar que siga pasándome esto a cada momento, y lo peor de todo, es que el problema no se evidencia rápidamente, normalmente lo podemos ver después de que creíamos que nuestra aplicación ya funcionaba a la perfección, en mi caso, no dejo de ver ésto ahora que estoy validando unos formularios.

¿Y dónde se genera esta problema?

Normalmente podemos verlo en casos como este:

public class LidiarConNullPointerException {

protected String bla;

public static void main(String[] args) {
LidiarConNullPointerException foo = new LidiarConNullPointerException();
System.out.println(foo.bla.length());
}
}

Si escribimos este código en un IDE como Netbeans éste no nos advertirá que la variable protegida de instancia “bla” no ha sido inicializada, y solo ha sido declarada.

Bueno, y luego al intentar imprimir la longitud de “bla” usando el metodo de este objeto length(), recibimos la excepcion porque en este punto la variable bla tiene el valor null, esto quiere decir que aún no alberga ningún objeto, la línea:

protected String bla;

con la que declaramos esta variable solo nos dice que la variable “bla” será del tipo String, pero hasta ahora no contiene ningún objeto, comprobémoslo:

public class LidiarConNullPointerException {

protected String bla;

public static void main(String[] args) {
LidiarConNullPointerException foo = new LidiarConNullPointerException();
System.out.println(“El valor de bla dentro de foo es: ” + foo.bla);
}
}

Bueno, entonces que hacemos para evitar éste problema, pues realmente a cualquiera le puede pasar, considerando que a veces tenemos una estructura como esta:

public class MiClase {

/**
* Variable privada aun sin inicializar
*/
private String foo;

/**
* Este metodo devuelve una referencia hacia el objeto foo del tipo String
* @return
*/
private String getFoo() {
return foo;
}

/**
* Este le asigna un valor a foo
* @param foo
*/
private void setFoo(String foo) {
this.foo = foo;
}

public static void main(String[] args) {

MiClase foo = new MiClase();
System.out.println(“Se genera una excepcion = ” + foo.foo.length());

}

}

Supongamos el caso de que esta clase esta diseñada para que primero se llame a setFoo() y solo después de haberlo hecho y haberle asignado un valor a la variable privada foo se pueda usar getFoo(), y pues por equivocación nuestra aplicación llama primero a getFoo() como en el ejemplo y además quiere realizar cierta operación sobre foo como en el ejemplo donde se intentó utilizar length(), pues recibimos nuevamente la molesta excepción.

Y… esto tiene solución:

– Pensemos bien en la estructura de lo que hacemos para que no suceda que lo del ejemplo, osea que queremos trabajar con una variable antes de inicializarla, y …


if (object.variable != null) {

int i = object.variable.lenght();

}

Comprobemos que el objeto no es nulo antes de trabajar con él.

PS:

Ver las referencias para ver el caso de “llamadaAMetodo(null);” y como manejarlo de manera correcta.

Referencias:

– http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception

Leave a Reply

Your email address will not be published. Required fields are marked *