- IN220, TP n°4 -

 

 

  > Débugger un premier programme

Dans la suite, vous allez apprendre à debugger un programme, c'est à dire à rechercher où se situe l'erreur quand un programme ne fait pas ce que qu'on attend de lui. Pour ce faire, vous allez apprendre à mettre en pause votre programme en pleine exécution, à examiner le contenu de chaque variable du programme à un moment précis, et à exécuter votre programme "pas à pas".

1) Voici la classe Main : compilez la et exécutez la. Une erreur devrait se produire.

 
public class Main
{
    public static void main( String[] args )
    {
        int[] tabulo = new int[5];
        tabulo[0] = 9;
        tabulo[1] = 13;
        tabulo[2] = 2;
        tabulo[3] = 7;
        tabulo[4] = 18;
        
        afficher_tableau(tabulo);
    }
    
    public static void afficher_tableau(int[] tab)
    {
        int compteur = 0;
        
        while(compteur < tab.length)
        {
            compteur = compteur + 1;
            System.out.println(tab[compteur]);
        }
    }
}

2) Pour comprendre ce qu'il se passe, on va demander au programme de se mettre en pause au début de la fonction afficher_tableau. Pour ce faire, sous BlueJ, cliquez dans la marge à la ligne de code où vous voudriez que le programme s'arrête : un panneau stop rouge devrait apparaître (comme sur la capture d'écran). On appelle ceci un point d'arrêt (ou breakpoint). Exécutez de nouveau votre programme.

 

 

3) Lorsque votre programme atteint la ligne de code où vous aviez placé un panneau, ce dernier se met en pause et vous voyez une nouvelle fenêtre apparaître : cette dernière (le debuggeur) permet d'avancer dans le programme, et d'examiner le contenu de chaque variable du programme (comme sur la capture d'écran). Dans l'éditeur de code, vous pouvez voir à quelle ligne se situe votre programme.

 

 

4) Les différents boutons de la fenêtre du debuggeur permettent d'avancer dans le programme (on ne peut jamais reculer). Le bouton "Un pas (même niveau)" permet d'avancer d'une ligne de code, sans rentrer dans les fonctions. Le bouton "Un pas (développer)" permet d'avancer dans le programme d'une ligne de code, tout en rentrant à l'intérieur des fonctions. Le bouton "Continuer" permet de reprendre l'exécution du programme (qui s'arrêtera au prochain point d'arrêt rencontré). Enfin, le bouton "Arrêter" permet de couper le programme.

Cliquez une fois sur "Un pas (même niveau)" : le programme avance d'une ligne dans le code, vous devriez voir la variable compteur faire son apparition.

 

5) Continuez à cliquer sur ce bouton et à regarder l'évolution du compteur (tout en regardant votre code) afin de comprendre d'où vient l'erreur (puis corrigez-la).

 

  > Débugger un second programme

1) Voici la classe Main : compilez la et exécutez la. Le programme fait une première erreur... A vous de trouver l'erreur (en utilisant les mêmes techniques que précédemment) et de la corriger.

 
public class Main
{
    public static void main( String[] args )
    {
        int compteur;
        int[] tabulo = new int[50];
        
        tabulo[0]=0;
        tabulo[1]=1;
        
        for(compteur=0; compteur<tabulo.length; compteur = compteur+1)
        {
            tabulo[compteur] = tabulo[compteur-1]+tabulo[compteur-2];
        }
        
        System.out.println(tabulo[tabulo.length-1]);
    }
}

2) Une fois l'erreur corrigée, vous vous rendez compte que le programme affiche, en dernière case du tableau, un nombre négatif... Or, on n'a fait qu'additionner des nombres positifs entre eux. Pour comprendre ce qui se passe, il va falloir trouver un moyen d'arrêter le programme au bon moment.

Pour ce faire, il faudrait positionner des breakpoints "sous condition" (c'est à dire que le programme ne s'arrête que si certaines conditions sont réunies). Malheureusement, dans BlueJ, ce n'est pas possible... On va donc rajouter un peu de code dans la boucle for.

Dans la boucle for, rajoutez un test (un if) qui regarde si la valeur que l'on range dans la case courante du tableau est plus petite que la valeur rangée dans la case précédente (ce qui ne devrait pas arriver). Si c'est la cas, affichez un message. Placez un breakpoint au moment où vous affichez le message, et exécutez le programme.

Lorsque le programme s'arrête, regardez la valeur de compteur, et les valeurs stockées dans le tableau. Pouvez-vous comprendre d'où vient l'erreur ?

 

  > Débugger un programme qui ne s'arrête pas

1) Voici la classe Main : compilez la et exécutez la. Le programme ne devrait pas s'arrêter. Pour arrêter le programme, dans la fenêtre principale de BlueJ, faîtes un clique droit sur la barre rouge en bas à gauche, et cliquez sur "Réinitialiser la machine virtuelle".

 
public class Main
{
    public static void main( String[] args )
    {
        int[] tabulo = new int[5];
        tabulo[0] = 9;
        tabulo[1] = 13;
        tabulo[2] = 2;
        tabulo[3] = 13;
        tabulo[4] = 18;
        
        trier_tableau(tabulo);
        
        for(int compteur=0; compteur < tabulo.length; compteur=compteur+1)
        {
            System.out.println(tabulo[compteur]);
        }
    }
    
    public static void trier_tableau(int[] tab)
    {
        boolean il_y_a_eu_changement=true;
        
        while(il_y_a_eu_changement == true)
        {
            il_y_a_eu_changement = false;
            
            for(int compteur=0; compteur < tab.length-1; compteur = compteur + 1)
            {
                if(tab[compteur] >= tab[compteur + 1])
                {
                    //On inverse les deux cases
                    int temp = tab[compteur];
                    tab[compteur]=tab[compteur+1];
                    tab[compteur+1]=temp;
                    
                    il_y_a_eu_changement=true;
                }
            }
        }
    }   
}

2) Pour comprendre ce qu'il se passe, on va demander au programme de se mettre en pause à un moment donné... Lancez de nouveau le programme, puis, allez dans la fenêtre principale de Java et cliquez sur Voir > Voir debuggeur afin d'afficher la fenêtre du debuggeur.

De là, cliquez sur "main (en cours)" puis sur le bouton "Arrêt" (pas le bouton Terminer !). Si vous ne voyez pas où le programme s'est arrêté dans le code, cliquez sur le bouton "Un pas (même niveau)". Regardez le contenu du tableau : il est trié...

Avancez pas à pas dans le programme afin de comprendre pourquoi ce dernier ne s'arrête pas, et corrigez-le.

 

  > Dernier debuggage

1) Voici la classe Main : ce programme est sensé trouver le plus grand élément d'un tableau. Faîtes en sorte qu'il fonctionne.

 
public class Main
{
    public static void main( String[] args )
    {
        int[] tabulo = new int[10];
        tabulo[0] = 9;
        tabulo[1] = 13;
        tabulo[2] = 2;
        tabulo[3] = 13;
        tabulo[4] = 18;
        tabulo[5] = 11;
        tabulo[6] = 21;
        tabulo[7] = 9;
        tabulo[8] = 3;
        tabulo[9] = 7;
        
        int max = plus_grand(tabulo);
        
        System.out.println(max);
        
    }
    
    public static int plus_grand(int[] tab)
    {
        int compleur=0;
        int max = tab[0];
        
        for(int compteur=1; compteur < tab.length; compteur = compteur+1)
        {
            if(tab[compleur] > max)
            {
                max=tab[compleur];
            }
            compteur=compteur+1;
        }
        
        return max;
    }
}