Bienvenidos una vez más a un nuevo
bloque dedicado a la programación en Java, en este bloque vamos a conocer un
nuevo concepto que es el debugging.
Depurar los programas en Eclipse también
llamado debugging o depurar el código, vamos a ver la
importancia de depurar nuestros programas.
En el bloque anterior hemos vistos que podemos cometer varios errores al crear nuestras aplicaciones:
Se pueden cometer errores de sintaxis
o errores en tiempo de ejecución. Sin embargo, hay veces que creamos nuestros
programas y no se muestran errores pero no realizan lo que teníamos esperado
que hiciera el programa, entonces nos toca depurar el programa para ver porque
no se ejecuta como nosotros teníamos pensado.
Para empezar a depurar el programa lo
vamos a hacer mediante una práctica, nos creamos un nuevo proyecto al que vamos
a llamar Depurar, dentro de este
proyecto un paquete al que vamos a llamar dep,
y una clase a la que vamos a llamar Aleatorios
cuyo código es el siguiente:
package dep;
import
javax.swing.JOptionPane;
public class Aleatorios {
public static void main(String[] args) {
int elementos=Integer.parseInt(JOptionPane.showInputDialog("Introduce
elementos de la matriz"));
int num_aleat[]=new int[elementos];
for(int i=0; i<num_aleat.length; i++) {
num_aleat[i]=(int)Math.random()*100;
}
for(int elem: num_aleat) {
System.out.println(elem);
}
}
}
Es un programa que mediante una ventana de JOptionPane nos indica que insertemos el número de elementos del array mediante un for recorre el array almacenando los números aleatorio y luego con for mejorado muestra los números aleatorio. Probamos la aplicación:
Y en consola en lugar de mostrarnos números aleatorios entre 1 y 100 nos muestra 0:
No muestra errores el código pero no
se está ejecutando como nosotros quisiéramos por lo que hay que depurar el
código para ver el error.
Para utilizar el debugging hay que introducir un punto de interrupción para incluir
una pausa en el punto del código que nosotros queramos. Vamos a insertar este
punto en la línea de código donde nos genera los números aleatorios:
num_aleat[i]=(int)Math.random()*100;
Con el botón izquierdo del ratón nos situamos sobre el número de la línea de código y hacemos clic:
Aparece un símbolo como una esfera pequeña de color azul es aquí donde se va a pausar la aplicación, luego tenemos que utilizar el botón Depurar:
Lo pulsamos:
Lo primero que se ejecuta es la línea de código 9 que es la ventana de JOptionPane, le indicamos, por ejemplo, 5 elementos al pulsar el botón de Aceptar continua en la línea 11, después ejecuta el bucle for en la línea 13 y en la línea 15 se para la ejecución:
Nos muestra también una ventana por si queremos mostrar el panel de Debugging le decimos Switch:
Por un lado tenemos el panel de Debug:
Nos indica el hilo de ejecución. Por otro lado, tenemos el panel de las variables, los breakpoints y las expresiones:
Nos hemos de fijar en este panel en la pestaña Variables, tenemos la variable args que contiene el método principal main, la variable elementos que le hemos indicado 5 la variable num_aleat el id que le da a las diferentes variables pertenece al espacio de la memoria interna del ordenador donde se almacena la variable o el objeto. Si desplegamos la variable num_aleat:
Vemos que hay cinco elementos pero
todos ellos tienen un valor de 0 hay que tener en cuenta que al pausar la
ejecución solo se ha recorrido una vez el for
por lo que solo debería haber rellenado el elemento 0.
También es importante estos dos
botones que están en la barra de herramientas:
Step Over
Step Into
Step Over sirve para avanzar una línea más después de hacer la pausa. Si pulsamos este botón:
Vemos que ahora la pausa está de nuevo en el bucle for, si volvemos a pulsar el botón Step Over vuelve a la línea 15
Nos ha sombreado la variable i en amarillo esto significa que esta
variable ha cambiado de valor, ahora vale 1 y al haber pasado ya una segunda
vez el bucle for en el primer elemento del array deberíamos tener ya un número
aleatorio y no es así.
Si pulsamos varias veces el botón Step over vemos que el for ha recorrido los 5 elementos pero ninguno ha generado el número aleatorio:
Por lo que ya podemos deducir el for se ejecuta correctamente pero la
instrucción que hay dentro no nos está generando los números aleatorios.
No obstante, pueden surgir dudas en cuanto a los bucles for, imaginaros que creéis que el error lo puede tener el for mejorado. Para ello volvemos a pulsar el botón Depurar introducimos ahora 8 elementos:
En uno de los elementos introducimos un número:
Pulsamos en el botón Step over hasta finalizar el programa:
Y vemos que nos ha impreso el número
que hemos introducido manualmente, en este punto ya tenemos la certeza de que
el error está en la instrucción del primer bucle for.
num_aleat[i]=(int)Math.random()*100;
Nos da un error porque lo que está
haciendo es almacenar en la posición del array lo que genera la expresión Math.random() le hace un casting y lo
multiplica por 100, por ejemplo, genera el número aleatorio 0,2891 al hacer el
casting al convertirlo en entero lo que hace es captar el 0 e ignorar lo que
hay después de la comilla, el número 0 al multiplicarlo por 100 da 0 por eso no
nos genera ningún número aleatorio. La solución es poner entre paréntesis toda
la expresión:
num_aleat[i]=(int)(Math.random()*100);
Para que no solo haga el casting a Math.random() sino a toda la expresión Math.random()*100. Es decir, se genera
el número aleatorio 0,2891 se multiplica por 100 siendo el resultado 28,91
luego realiza el casting.
Si no lo tenéis claro del todo lo podéis
comentar a través de los comentarios del blog para ver en qué punto os habéis
perdido o tenéis dudas y así ayudarnos entre todos. Os espero en el próximo post.
Saludos!
10.8 CLÁUSULA FINALLY << >>
11.2 DEBUGGING
No hay comentarios:
Publicar un comentario