Evitar algunos errores

Algunos errores ocurren en ciertos casos que no hemos creidoque pudieran llegar a pasar. Por eso he decidido poner algunos truquillos que ayuden a detectarlos y pido a los lectores que amplien este artículo con más trucos y consejos. 

1º- Evitar asignaciones en los bloques if, while, … 

Ejemplo: 

if(opcion=5){ 
… 

El problema aquí es que opcion toma el valor cinco y entra en el bloque de la condición siempre, independientemente de lo que valiera antes. 

La solución es tan simple como que el orden de los factores no altera el resultado a la hora de comparar: 

if(5=opcion){ 
… 

En este caso el compilador se quejaría al querer asignar un valor a una constante. 

2º- Comparación de cadenas de caracteres: 

if( str.equals(“Hola”) ){ 
… 
}
 

A simple vista parece que no puede haber problema alguno, pero ¿que pasatia si la cadena str apuntara a null? Pues que se lanzaría una excepcion por la llamada a un metodo de un objeto sin inicializar y rompería con la ejecucion del proceso. 

¿Como solucionarlo? Usando el otro objeto a comparar, es decir, “Hola”; puesto que es un objeto que siempre va a estar declarado e inicializado, y cuyo metodo equals no falla por pasarle un parametro nulo. 

if( “Hola”.equals(str) ){ 
… 
}
 

3º- Sembrado de sentencias 

Este es el sistema por excelencia. Consiste en hacer que imprima mensajes para conocer que instrucciones se está ejecutando. 

Lo óptimo sería que en cada mensaje se especifique cual ha sido la instrucción siguiente a ejecutar y además se impriman los datos de las variables afectadas. 

En proyectos grandes esto podría llegar a resultar un caos, así que se puede hacer una variante que consiste en imprimir todos esos mensajes a un fichero de texto. 

Tambien sería ideal que en vez de usar el mítico System.out.println() se use una función tal que: 

/* … */ 
public static final boolean DEBUG_ON=true; 

public void debug(String s){ 
if(DEBUG_ON) 
System.out.println(s); // O la insercion de dicho mensaje a un fichero. 

De esta forma con cambiar el valor de true a false, ya conseguiríamos que se muestren o no dichos mensajes. 

Insisto que en cada mensaje debe ser descriptivo de la situación. 

Ejemplo: 

public float test(){ 
debug(“Funcion test()”); 
int a,b,c; 
a=1; 
b=2; 
c=0; 
debug(“return (a+b)/c; a=”+a+”; b=”+b+”; c=”+c+”;”); 
return (a+b)/c; 
}
 

4º- Manejo de excepciones 

Toda funcion debería lanzar o manejar las posibles excepciones que pudiera ocurrir, evitando dejar a su libre albedrío los diversos problemas que pudieran ocurrir. Como este es un tema bastante amplio, me limitaré a un caso general de manejo de las excepciones que consiste en el uso de un bloque try{…}catch(){} que se puede usar casi siempre. 

Lo más indicado para meter en el bloque catch seria esto: 
try{ 
… 
}catch(Exception e){ 
e.printStackTrace(); 
}
 

Esto lo que hace es que a la hora de que salte una excepcion, imprima un informe indicando que excepcion se ha lanzado, un mensaje explicativo (a veces no muy explicativo) y la representación de la pila de funciones, esto es saber que linea estaba ejecutando cierta funcion, la clase a la que pertenece esa funcion, el fichero de esa clase, etc. ¿Y por qué salen varias funciones? Facil, porque una funcion habrá llamado a otra y esa a otra etc… 
De todas esas lineas solo nos interesarán las que esten asociadas a clases nuestras. De esta forma sabremos que linea ha producido el fallo, porque se ha producido, quien llamo a ese metodo, etc…, información más que útil para poder solucionar los errores que puedan ocurrir.

Fuente: http://www.mygnet.net/articulos/java/evitar_algunos_errores.1114

Leave a Reply

You must be logged in to post a comment.