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 :

Déréférencement d'un pointeur null (dans une classe)


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Par défaut Déréférencement d'un pointeur null (dans une classe)
    Bonjour,

    Suite à une analyse de code, Sonar me retourne le message suivant :

    Déréférencement d'un pointeur null dans la méthode org.polymorphisme.swing.EssaisJButtonListener.actionPerformed(ActionEvent)"
    en me précisant que le déréférencement est en rapport avec la ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(CLIQUER + str + ".");
    Sauriez vous m'expliquer comment se fait-il qu'il y ait un déréférencement ?

    Ma classe est simple :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public class EssaisJButtonListener extends JFrame implements ActionListener {
     
      private JButton jButtonIci;
      private JButton jButtonLa;
      private static final String CLIQUER = "Vous avez cliquer ";
     
      private JPanel buildContentPane() {
        JPanel jPanel = new JPanel();
        jPanel.setLayout(new FlowLayout());
        jButtonIci = new JButton(ICI);
        jButtonLa = new JButton(LA);    
        jButtonIci.addActionListener(this);
        jPanel.add(jButtonIci);
        jButtonLa.addActionListener(this);
        jPanel.add(jButtonLa);
     
        return jPanel;
      }
     
      public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
     
        String str = "";
     
        if (source.equals(jButtonIci)) {
          str = jButtonIci.getText();
        } else if (source.equals(jButtonLa)) {
          str = jButtonLa.getText();
        }
     
        System.out.println(CLIQUER + str + ".");    
      }
    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Je suis perplexe. A vue de pif, je suppose que sonar assume que JButton.getText() peux renvoyer null? Si tu retire le +str dans la ligne incriminée, le test passe?

  3. #3
    Membre Expert
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Par défaut
    Bonjour,

    moi aussi j'ai été surpris par cette remarque de Sonar,
    d'autant plus qu'aucune information du compilateur ne l'indique,
    j'ai vu écris un code similaire dans ces programmes que je crois bien écrit,
    je pense à FOP par exemple.

    Ceci étant, si j'enlève la chaine "+ str"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(CLIQUER + ".");
    Alors il n'y a plus de déréférencement.

    A mieux regarder, j'ai remarqué que lorsque j'avais quelque chose tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     UnObjet str = "";
     
        if (cond) {
          // affectation d'une valeur pour str
        }
     
        // instruction avec str.
    Alors il y a déréférencement. Mais je ne vois pas pourquoi puisque mon objet a une valeur ?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    est-ce que, dans un des chemins, tu attribue une valeur qui viendrais d'un champ? Sonar pourrais dans un premier temps conclure que ce champ peux être null et, par conséquent, tout ce qui récupère une copie de ce champ peux devenir null...

  5. #5
    Membre Expert
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Par défaut
    Non, ce n'est pas le cas.

    Pas plus que dans mon petit exemple,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
     
        String str = "";
     
        if (source.equals(jButtonIci)) {
          str = jButtonIci.getText();
        } else if (source.equals(jButtonLa)) {
          str = jButtonLa.getText();
        }
     
        System.out.println(CLIQUER + str + ".");    
      }
    Je crois qu'il faudrait que j'aille fouiller la documentation de Sonar ou lire la classe correspondant à la détection d'un déréférencement.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je viens de regarder le code de AbstractButton, et, effectivement, getText() peux renvoyer null.

Discussions similaires

  1. [2.x] Attribut NULL dans une classe Symfony2
    Par ashanka dans le forum Symfony
    Réponses: 2
    Dernier message: 05/01/2012, 11h16
  2. Réponses: 3
    Dernier message: 23/09/2010, 16h52
  3. Réponses: 21
    Dernier message: 14/01/2010, 12h50
  4. passage pointeur NULL dans une fonction
    Par reptils dans le forum C
    Réponses: 4
    Dernier message: 11/05/2006, 23h12

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