All posts by hablutzel1

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

Mis primeros pasos en Unit Testing – JAVA

Bueno, les cuento que me estoy introduciendo al mundo de las unidades de prueba, es una manera bastante entretenida de programar, y sin duda es una buena práctica, porque nos puede dejar seguros (despues de escribir una prueba unitaria para una determinada clase, metodo…) de que si esta parte del software cambia, entonces nosotros lo sabremos.

Básicamente las herramientas que he comenzado a explorar para realizar esto son JUnit 4, EasyMock y un buen entorno de desarrollo para facilitarme el trabajo, ésta vez decidí usar Netbeans 6.5, éste nos puede ayudar creándonos las plantillas para nuestras pruebas unitarias, bueno a continuacion les dejo un ejemplo de una simple prueba unitaria sin el uso de Mocks, esto lo dejaré para otra ocasión:

— Divisor.java —

</pre>
public class Divisor {

public static double dividir(int a, int b) throws Exception {
if (b == 0 ) {
throw new Exception("Intento de dividir entre cero");
}
double c = (float) a / (float) b;
return c;
}

public static void main(String[] args) throws Exception {
System.out.println(Divisor.dividir(3, 0));
}
}

— DivisorTest.java —

</pre>
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

public class DivisorTest {

public DivisorTest() {
}

/**
* Test of dividir method, of class Divisor.
*/
@Test(expected = Exception.class)
public void testDividir() throws Exception {
System.out.println("dividir");
int a = 4;
int b = 0;
Divisor.dividir(a, b);

}
@Test
public void testDivisorHappyPath() throws Exception {
System.out.println("Happy Path");
int a = 6;
int b = 3;
double expected = 2;
assertEquals(Divisor.dividir(a, b), expected, 0);
}
}

Creen la clase Divisor dentro de cualquier proyecto de Netbeans, y luego generen DivisorTest usando el Netbeans, para esto vayan a New y luego “Test for existing Class”, seleccionan la clase Divisor y Netbeans generara una plantilla que luego puedenmodificar para que se parezca a la de arriba. Ahora que ya tienen la clase y el test para un método de la misma pueden ejecutar el test haciendo clic en Run (con el test en la ventana actual), entonces verán un mensaje que confirmará el estado de los tests.

Bueno, con respecto a los métodos usados en este ejemplo:

@Test(expected = Exception.class) —-> Junit espera que este metodo de prueba arroje esta excepcion, y lo hara pues nuestra clase Divisor lo arroja cuando intentas dividir entre cero

assertEquals(Divisor.dividir(a, b), expected, 0); —-> Junit le da su visto bueno a este metodo de prueba si esto se cumple

Happy Path —–> http://en.wikipedia.org/wiki/Happy_path no es gracioso el termino??

Ahora, para que sirve esto realmente? Bueno imaginen que un día llegan de una fiesta(Ebrios) a casa y sin darse cuenta siquiera abren el Netbeans y modifican la clase Divisor, de tal forma que simplemente ya no funciona. Si escribieron un test para las diversas formas en las que ésta puede utilizarse lo mas probable es que al día siguiente, cuando se den cuenta de que hay un error, baste con ejecutar los tests para que estos le digan como está fallando su clase, ahora imaginen que tienen muchas clases, propensas a fallar después de darles mantenimiento (o de llegar ebrio a casa xD), acaso no creen que un unit test que nos haga recordar como deben funcionar nuestras clases no nos ayudaría?

Creando un modulo para Prestashop

En esta pequena entrada veremos como crear un modulo sencillo para prestashop, un sistema de tienda Virtual semejante a Oscommerce. Al decir modulo me refiero a uno de los bloques que pueden verse en la primera pagina.

Ejemplo:

ejemplo_de_modulos_prestashop

El ejemplo que veremos sera bastante sencillo, crearemos una carpeta con el nombre “hellototheworld” y dentro de ella crearemos dos archivos:
hellototheworld.php y hellototheworld.tpl (tambien podemos crear un tercer archivo “logo.gif” de 17px X 17px para verlo en el panel de administracion Prestashop)

Cabe mencionar que el archivo php es donde se almacena el controlador Smarty pues estos modulos siguen una arquitectura MVC y el archivo tpl es la vista (la V de MVC para los que no lo sepan).

Bueno, vayamos directo a nuestro ejemplo:

hellototheworld.php

<?php


class
hellototheworld extends Module

{

function __construct()

{

$this->name = ‘hellototheworld‘;

$this->tab = ‘Blocks’; // esto sirve para especificar el grupo dentro de modulos
$this->version = 0.1;
// la version de nuestro modulo


$this->page = basename(__FILE__, ‘.php’);
//ubicamos la ruta hacia nuestro archivo

$this->displayName = $this->l(‘Hola Mundo’);
// este es el nombreque veremos en el panel de administracion para nuestro modulo
$this->description = $this->l(‘Esta es solo una simple descripcion de nuestro modulo 🙂 ‘);

}


// funcion para instalar el modulo, esta sera usada cuando seleccionemos nuestro modulo y lo instalemos haciendo clic en el boton destinado para este proposito en el CP
function install()

{

if (!parent::install())

return false;

if (!$this->registerHook(‘rightColumn’) OR !$this->registerHook(‘leftColumn’))

return false;

return true;

}

//este metodo carga el template que creamos: hellototheworld.tpl
function hookRightColumn($params)

{

global $smarty;

return $this->display(__FILE__, ‘hellototheworld.tpl‘);

}

//este metodo copia el funcionamiento del anterior
function hookLeftColumn($params)

{

return $this->hookRightColumn($params);

}


}

?>

El siguiente archivo es:
hellototheworld.tpl

<div class=”block” >
<h4>Hola Mundo!</h4>
<div class=”block_content”>
<p>Hola Mundo soy un bloque nuevo y albergo un parrafo, aunque tambien podria almacenar
imagenes, ficheros flash, y archivos generados dinamicamente generados por nuestro
hellototheworld.php, pero esto no lo veremos en este pequeno tutorial
</div>
</div>

Como podemos ver existen dos clases CSS: “block” y “block_content”, estas son las que haran que nuestro modulo se vea muy parecido a los otros, quiero decir, con la misma cabecera y tipo de letra para el titulo, todo lo demas es configurable, tu puedes crear tus propias hojas de estilos sin problemas.

Despues de esto, ya estamos preparados para empaquetar nuestro modulo e instalarlo, para este fin empaquetaremos la carpeta completa en el formato .tar (no .tar.gz) y haremos referencia a la url que alberga esta carpeta desde la opcion de instalacion de modulos, esto se puede conseguir creando una carpeta en la raiz de nuestro dominio y copiando el comprimido en ella, luego haremos referencia a nuestro archivo asi:

http://www.example.com/carpeta_temporal/hellototheworld.tar

Y listo, ya tenemos instalado nuestro modulo, despues de esto solo nos queda activarlo, y asignarle una posicion usando la pestana posiciones dentro del menu de modulos.

ejemplo_culminado

PS:

– Este articulo es realmente sencillo, para profundizar mejor recomendaria estudiar lo siguiente: CSS y Smarty.

– He notado algunos errores al posicionar este modulo.