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

avec Java Discussion :

Null object reference


Sujet :

avec Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Null object reference
    Une des plaies de la programmation objet est l'erreur trop souvent rencontrée Null object reference.

    Il est élégant d'écrire une instruction comme objA.objB.methode ... qui plante si la référence objB n'est pas instanciée. On peut toujours vérifier avant l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (objA != null && objA.objB != null) 
       objA.objB.methode
    mais c'est déjà beaucoup moins élégant

    C'est plus objet mais pas plus beau avec un try catch.

    Avez vous un pattern sympa pour solutionner ce problème ?

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Kio,
    Citation Envoyé par elisfr Voir le message
    Avez vous un pattern sympa pour solutionner ce problème ?
    Oui, elle est même très simple :

    - coder proprement

    - et pour cela, entre autres, toujours vérifier la validité des pointeurs (ce qui implique de les mettre à NULL quand on libère).

    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    C'est justement le sens de ma question. : comment tester proprement la validité d'une référence (pointeur n'est pas le terme le plus approprié) ?

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Kio,

    Je ne vois pas ce que tu veux dire par "comment tester proprement la validité".

    Il faut comparer à la valeur indiquant l'invalidité NULL, c'est tout.

    Maintenant, si, comme tu en parles dans ton premier post, tu penses qu'ajouter des tests dans ton programme n'est pas "élégant", eh bien, il faudra que tu sois moins élégant.

    (A moins que tu trouves comment faire un test sans en faire... )
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Membre averti Avatar de welcome_59
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 203
    Points : 352
    Points
    352
    Par défaut
    comment tester proprement la validité d'une référence
    Réponse dans la spécification de la technologie et l'API que tu utilises, et souvent ça donne "==", "equals()" ou autre selon les cas; ça dépend aussi en grande partie de l'application que tu codes.
    SCJP 5 | CAPM

  6. #6
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Si tu dois vérifier qu'une référence n'est pas nulle avant chaque manipulation d'objet, soit 90% des instructions, tu n'est pas couché. Il n'y a pas de solution à cela. Tout réside dans la vigilance du programmeur.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Cette exception est un reliquat des temps anciens (C/C++), un langage moderne ne devrait pas autoriser à affecter NULL à un objet. Lorsqu'un calcul peut échouer, il faut que ce soit explicite dans la spécification de ce calcul, et que la prise en compte de l'échec soit obligatoire dans le code utilisant ce calcul.

    Un langage comme Haskell permet facilement ce genre de chose, avec un type comme "Maybe a" qui permet d'enrober un type quelconque par une gestion d'échec et n'autorise pas à simplement ignorer cette possibilité.

    Le fait que les Null pointer exceptions soient si difficiles à prévoir et à éviter démontre bien qu'il s'agit d'une faille fondamentale dans les langages qui y sont sujets.

    --
    Jedaï

  8. #8
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Oui, tout à fait, et en ce sens les langages fonctionnels ont apporté beaucoup.

    Dans le cas de Java, je dirais que ne jamais laisser la possibilité à une référence d'être null permet de s'en sortir. Si un objet n'existe pas, il est inutile de le référencer !

    Mais j'ajouterai quelque chose : je ne suis pas sûr, dans le cas de Java, qu'une référence null indique que l'allocation de l'objet a échoué. Si je me souviens bien, c'est une liberté laissée au programmeur que d'initialiser une référence à null... donc si on n'en utilise jamais, il n'y aura jamais de problème.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  9. #9
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par InOCamlWeTrust Voir le message
    Dans le cas de Java, je dirais que ne jamais laisser la possibilité à une référence d'être null permet de s'en sortir. Si un objet n'existe pas, il est inutile de le référencer !
    Il se peut que l'on ait justement oublié une allocation quelque part.

    Un exemple, lorsque l'on crée des IHM sous forme d'application Web avec Java, on peut se retrouver à avoir des formulaires de saisis d'utilisateurs et des classes qui représente ce formulaire.

    Par exemple, un formulaire de saisi pour la recherche d'une personne pourrait contenir les champs : Integer age; String nom...
    Il suffit d'oublier un champs lors de la création du formulaire pour se retrouver avec des références null.

    Mais c'est une erreur de programmation dans ce cas, je ne sais pas si tu parlais de ce type de cas.
    Je ne répondrai à aucune question technique en privé

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Dans le cas d'une association avec une cardinalité 0..1 on peut rencontrer une référence nulle. Dans ce cas la référence à nulle porte une signification métier. Toute la difficulté est bien là.

    Si une classe A est associée à une classe B avec une cardinalité 0..1 et que l'on instancie un objet de la classe A ; que faut-il faire si cet objet n'est pas associé à un objet de la classe B ?
    On est pas dans un cas d'erreur (au sens métier).
    On a bien objA != null et objA.objB == null

  11. #11
    screetch
    Invité(e)
    Par défaut
    dans ce cas, le fait que objA.objB != null est une precondition necessaire a l'execution de ton code; et dans ce cas, assert que objA.objB est different de null.

  12. #12
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par screetch Voir le message
    dans ce cas, le fait que objA.objB != null est une precondition necessaire a l'execution de ton code; et dans ce cas, assert que objA.objB est different de null.
    Et il devrait le faire à chaque fois qu'il utilise cet objet ? A mon avis c'est une erreur de design en amont : cet objet qui peut être null ne devrait pas être accessible directement.

    --
    Jedaï

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut un article interressant à ce sujet
    Un article interessant de Handers Heljberg (auteur de C#) qui me semble clore cette discution : il faut attendre la solution dans les prochains langages.

    http://www.computerworld.com.au/inde...6074;fp;;fpid;

  14. #14
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Citation Envoyé par elisfr Voir le message
    Il est élégant d'écrire une instruction comme objA.objB.methode ... qui plante si la référence objB n'est pas instanciée.

    Avez vous un pattern sympa pour solutionner ce problème ?
    C'est dans l'idée du pattern "Null Object" : http://en.wikipedia.org/wiki/Null_Object_pattern
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 24/10/2012, 23h37
  2. Réponses: 2
    Dernier message: 11/12/2006, 09h31
  3. Réponses: 1
    Dernier message: 20/04/2006, 12h09
  4. [C#][debutant]erreur => object reference is required for a no
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 3
    Dernier message: 25/01/2006, 13h47
  5. [C#][.net2] NULL Object reference lors de l'accès à un DGV
    Par VincenzoR dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/01/2006, 02h00

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