IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Petit test pour des pro du java


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de vincent63
    Inscrit en
    Octobre 2005
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 198
    Par défaut Petit test pour des pro du java
    Bonjour,
    Dans une application, je me suis retrouvé confronté à une null pointer exception. Ce genre de problème est en général simple à résoudre. Là, la correction a été un peu plus subtile. Du coup je vous propose de la chercher. J'espère que ça vous amusera un peu

    La règle : ne pas utiliser le debugger => trop facile
    Eviter les corrections du genre si truc == null alors truc = new Machin();
    La correction ne demande en fait qu'une très très légère modification.

    Voilà une version simplifiée des classes qui vont vous permettre de reproduire le bug.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    package com.test.java;
     
    public class Application {
     
        public static void main(String[] args) {
            new Fille().printMessage();
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package com.test.java;
     
    public class Fille extends Mere {
     
        private String message = null;
     
        public Fille() {
            super();
        }
     
        public void initialiseFille() {
            System.err.println("1. J'initialise l'object message");
            message = "Bonjour le monde";
            System.err.println("2. Sa valeur est : " + message);
        }
     
        public void printMessage() {
            System.err.println("3. J'affiche la taille du message");
            System.err.println("Taille du message = " + message.length());
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package com.test.java;
     
    public abstract class Mere {
     
        public Mere() {
            initialiseMere();
        }
     
        private void initialiseMere() {
            initialiseFille();
        }
     
        public abstract void initialiseFille();
    }

  2. #2
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par vincent63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    package com.test.java;
     
    public class Application {
     
        public static void main(String[] args) {
            new Fille().printMessage();
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package com.test.java;
     
    public class Fille extends Mere {
     
        private String message = null;
     
        public void initialiseFille() {
            System.err.println("1. J'initialise l'object message");
            message = "Bonjour le monde";
            System.err.println("2. Sa valeur est : " + message);
        }
     
        public void printMessage() {
            System.err.println("3. J'affiche la taille du message");
            System.err.println("Taille du message = " + message.length());
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package com.test.java;
     
    public abstract class Mere {
     
        public Mere() {
            initialiseMere();
        }
     
        private void initialiseMere() {
            initialiseFille();
        }
     
        public abstract void initialiseFille();
    }
    Le problème se trouve dans le main quand tu appelles la methode printMessage(). La
    variable message n'est pas initialisée.

  3. #3
    Membre expérimenté Avatar de vincent63
    Inscrit en
    Octobre 2005
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 198
    Par défaut
    Effectivement, la variable message est null.
    On peut le voir aux traces lors de l'exécution.
    Mais si tu regardes tes traces, tu peux aussi voir que juste avant de demander sa taille, on affiche sa valeur et elle n'est pas null.
    On obtient quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1. J'initialise l'object message
    2. Sa valeur est : Bonjour le monde
    3. J'affiche la taille du message
    NullPointerException...
    Il te reste donc à trouver la correction.
    Bon courage.

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,
    la c'est un peu facile
    il suffit que ta variable message soit declaré comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private String message = "";
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 111
    Par défaut
    trouvé.

    le constructeur de la classe mère donne bien une valeur au message mais le constructeur de la classe fille la repasse a null.

    il faut appeller le initialiseFille apres le super, ou mettre la variable message dans la classe mère ( en passant le private en protected).

  6. #6
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    Citation Envoyé par eclesia Voir le message
    trouvé.

    le constructeur de la classe mère donne bien une valeur au message mais le constructeur de la classe fille la repasse a null.

    il faut appeller le initialiseFille apres le super, ou mettre la variable message dans la classe mère.

  7. #7
    Membre éclairé
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 28
    Par défaut
    il ne faut pas initialiser les valeures par defaut,car ca les réinitialises apres l'appel du constructeur parent. Donc faire une déclaration comme suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private String message;
    en plus la fonction inialiserfille semble servir a initaliser les valeures de la fille... c'est contradictoire avec la déclaration.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. quelque petite question pour des windows messages
    Par julspower dans le forum C++
    Réponses: 3
    Dernier message: 02/12/2008, 17h54
  2. Test pour des modèles non-ActiveRecord
    Par Flackou dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 11/08/2008, 10h23
  3. pour des pros
    Par m3am3a dans le forum C
    Réponses: 3
    Dernier message: 24/11/2007, 21h37
  4. Un défi pour des pros
    Par Total_amateur dans le forum Langage
    Réponses: 9
    Dernier message: 17/10/2006, 10h03
  5. [Lambda] un petit test pour comprendre
    Par airod dans le forum Tkinter
    Réponses: 4
    Dernier message: 01/03/2006, 14h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo