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

Java Discussion :

Java - getter d'un Set et inattendu null


Sujet :

Java

  1. #1
    Membre habitué
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    167
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 167
    Points : 143
    Points
    143
    Par défaut Java - getter d'un Set et inattendu null
    Bonjour à tous,

    il m'arrive un truc bizarre et je ne trouve pas la solution concernant un NullPointerException.

    J'ai une entité qui contient le champs suivant suivant et son getter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ....
       @ManyToMany
        @JoinTable(name = "ERPROBUNGSOBJ_PRNR_T", joinColumns = @JoinColumn(name = "ERPROBUNGSOBJEKT_ID", referencedColumnName = "ERPROBUNGSOBJEKT_ID"), inverseJoinColumns = @JoinColumn(name = "PRNR_ID", referencedColumnName = "PRNR_ID"))
        private Set<PrNummerEntity> prNummern = new HashSet<PrNummerEntity>();
    ....
     public Set<PrNummerEntity> getPrNummern() {
            if (prNummern == null) {
                prNummern = new HashSet<PrNummerEntity>();
            }
            return prNummern;
        }
    ....
    Dans mon code, un converter utilise ce getter mais quand le mon champ prNummer est null, malgrés mon initialisation, null est retourné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    Set<PrNummerEntity> prnrEntities = entity.getPrNummern();
                if (prnrEntities != null) {
                    for (PrNummerEntity prNrEntity : prnrEntities) {
    ...
    Avec des test unitaires, je n'ai jamais de NPE...



    Avez vous une idée? un conseil?

  2. #2
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    c'est pas plutôt entity qui est null ?

    parce que dans le getter ou le parcours, je ne vois aucune occasion de lever une NPE...
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #3
    Membre habitué
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    167
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 167
    Points : 143
    Points
    143
    Par défaut
    Citation Envoyé par Gardyen Voir le message
    c'est pas plutôt entity qui est null ?

    parce que dans le getter ou le parcours, je ne vois aucune occasion de lever une NPE...
    non non, car mon code initiale était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Set<PrNummerEntity> prnrEntities = entity.getPrNummern();
    for (PrNummerEntity prNrEntity : prnrEntities) {
    et je n'ai pas eu une NPE avec
    Set<PrNummerEntity> prnrEntities = entity.getPrNummern();
    mais dans le for...

    Par ailleurs, en mode debug, je passe par la ligne d'initialisation de mon Set mais lors du return, le set est toujours null.

  4. #4
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    intéressant

    hum si je ne m'abuse ton prNummern ne peut pas être null à l'initialisation, même au départ il est initialisé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Set<PrNummerEntity> prNummern = new HashSet<PrNummerEntity>();
    donc prochaine question: y a-t-il un moment où tu le mets à null ?
    si la réponse est jamais, ça doit pas venir du set lui-même

    questions subsidiaires: hibernate ? lazy loading ? proxy ?
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    La stacktrace + le code appelant pourraient aider à comprendre.

  6. #6
    Membre habitué
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    167
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 167
    Points : 143
    Points
    143
    Par défaut
    @Gardyen:
    1- tu as raison, le set est déjà initialiser dans la classe.
    2- il existe bien un setter pour ma classe
    3- je ne l'ai jamais initialiser à null
    4- openJPA
    5- Set utilisé import java.util.Set;

    @Mathieu.J
    Désolé, je n'ai pas les stacktrace et pour ce qui est de l'appel, j'ai donné précédement les lignes d'appels, à savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set<PrNummerEntity> prnrEntities = entity.getPrNummern();
    for (PrNummerEntity prNrEntity : prnrEntities) {

  7. #7
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    sans stacktrace, on ne peut que supposer.

    en me documentant sur openJPA, je suis tombé sur cet article

    du coup ton erreur ressemble beaucoup à une erreur de proxy/lazy-loading: est-ce que ta connexion à la base est toujours ouverte quand tu accèdes à ta collection ?
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  8. #8
    Membre habitué
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    167
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 167
    Points : 143
    Points
    143
    Par défaut
    Citation Envoyé par Gardyen Voir le message
    sans stacktrace, on ne peut que supposer.

    du coup ton erreur ressemble beaucoup à une erreur de proxy/lazy-loading: est-ce que ta connexion à la base est toujours ouverte quand tu accèdes à ta collection ?
    Maintenant que tu m'en parle, c'est vrai qu'il y avait un proxy. Je m'en souviens maintenant... Du coup, ma solution pourrait être:

    @ManyToMany(fetch=FetchType.EAGER)

    n'est ce pas? Quel impact cela peut il avoir en terme de performances?

  9. #9
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    tu vas simplement charger tous les éléments de la collection au moment de la requête... ce qui peut faire beaucoup suivant la taille de la base et le nombre d'entités liées...
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  10. #10
    Membre habitué
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    167
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 167
    Points : 143
    Points
    143
    Par défaut
    Non je ne vais pas le faire car je ne mesure pas l'impact que cela peut avoir dans mon code. Par contre, je vais informer dardar mes collègues du phénomène.

    Il faut dire que le mode debug est déroutant puisque le code du getter est affiché lors de l'appel ce dernier bien que ce soit le proxy qui soit executer...

    Merci en tout cas pour le coup de main

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

Discussions similaires

  1. Réponses: 38
    Dernier message: 05/02/2015, 16h30
  2. Réponses: 3
    Dernier message: 14/03/2011, 17h12
  3. Réponses: 2
    Dernier message: 24/06/2008, 16h30
  4. Comment mon getter de formFile de Struts renvoie null?
    Par Lil'Ing dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/12/2007, 15h35

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