Exercice Java de base – trouver les erreurs

[tab name=’Exercice Java’]

Le fichier Erreurs.java contient les déclarations de deux classes. La classe Erreurs contient une méthode main et sert à démarrer le programme. La classe GrillePain sert à représenter des grille-pains dans le programme sous forme d’objets dotés de deux variables d’instance: l’année de fabrication et le nombre de tranches que l’appareil peut griller. Il y a également une méthode d’instance afficherVariables que l’on peut appliquer sur un objet de type GrillePain afin d’afficher les valeurs de ses variables d’instance.

  1. Eclipse vous signale des messages d’erreurs à propos de ce programme. Pourquoi? Corrigez-les.
  2. L’affichage lors de l’exécution montre que la variable d’instance nbTranches a la valeur 0 pour les deux grille-pains même si l’on a envoyé une autre valeur à la méthode constructeur. Pourquoi? Corrigez le programme.

Exemple d’exécution du programme (après la première correction):

Objet de type GrillePain avec variables d'instance 
         annee = 1995 et nbTranches = 2
Objet de type GrillePain avec variables d'instance 
         annee = 1998 et nbTranches = 4

Code donné:

class Erreurs {
    public static void main(String[] args) {
        GrillePain g1 = new GrillePain(1995, 2);
        g1.afficherVariables();
        GrillePain g2 = new GrillePain(1998, 4);
        g2.afficherVariables();
    }
}

class GrillePain {
    private int annee;
    private int nbTranches;
    private GrillePain(int a, int nbTranches) {
        annee = a;
        nbTranches = nbTranches;
    }
    private void afficherVariables() {
        System.out.println
        ("Objet de type GrillePain avec variables d'instance année = " +
         annee + " et nbTranches = " + nbTranches);
    }
}

[/tab][tab name=’Correction’]

  1. Le programmeur a trop utilisé le mot-clé private au point que l’on ne peut même pas accéder à la méthode constructeur depuis l’extérieur de la classe, ni à la méthode afficherVariables(). Il faut rendre ces deux méthodes publiques en supprimant le mot-clé private.
  2. Les variables d’instance (mais pas les variables locales) reçoivent toujours des valeurs par défaut. Si la variable d’instance nbTranches n’est pas initialisée, elle aura donc la valeur 0. Dans la méthode constructeur, il y a une situation de shadowing où le paramètre a le même nom que la variable d’instance. Il faut utiliser l’objet this pour différencier les deux et ainsi affecter la valeur du paramètre nbTranches à la variable d’instance nbTranches.
/* Version corrigée */
class Erreurs {
    public static void main (String[] args) {
        GrillePain g1 = new GrillePain(1995, 2);
        g1.afficherVariables();
        GrillePain g2 = new GrillePain(1998, 4);
        g2.afficherVariables();
    }
}

class GrillePain {
    private int annee;
    private int nbTranches;

    public GrillePain (int a, int nbTranches) { // !!! pas de private
        annee = a;
        this.nbTranches = nbTranches;           // !!! this
    }

    public void afficherVariables() {           // !!! pas de private
        System.out.println
        ("Objet de type GrillePain avec variables d'instance année = " +
         annee + " et nbTranches = " + nbTranches);
    }
}

 

[/tab][end_tabset skin= »ginger » ]

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *