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

Composants Java Discussion :

Problème NullPointerException JTextField.setText avec Netbeans


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Par défaut Problème NullPointerException JTextField.setText avec Netbeans
    Bonjour à tous,

    Je vous sollicite en espérant que vous allez pouvoir élucider mon problème, voilà ! Je développe une application avec Netbeans et via un fichier XML je récupère des données que j'affecte dans des JTextField via la méthode setText, vous me direz ... Jusqu'ici tout est normal alors où le problème ?

    Le problème tient de la science fiction :
    Si je fais un copié/collé de mon code vers Eclipse tout fonctionne correctement je récupère bien mes données que j'affecte dans la JTextField en revanche sur Netbeans c'est pas la même histoire il m'affiche le message suivant : "Exception in thread "main" java.lang.NullPointerException" alors que c'est exactement e même code je n'ai rien changé.

    Je vous remercie d'avance à tous pour votre.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Donne nous l'extrait de code, en nous précisant la ligne où arrive l'exception, avec la stacktrace.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Par défaut
    Bonjour Joël !

    Merci une nouvelle fois de t'impliquer dans mes problèmes donc pour faire suite à demande voici une partie du code qui pose problème :

    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
     
        public static void LoadData() throws ParserConfigurationException, IOException, SAXException {
     
            org.w3c.dom.Document document;
     
            String xmlDoc = f.getAbsolutePath().substring(0, f.getAbsolutePath().length() - 1) + "hoteldata.xml";
            javax.xml.parsers.DocumentBuilderFactory builderFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
            javax.xml.parsers.DocumentBuilder builder = builderFactory.newDocumentBuilder();
     
            document = builder.parse(new org.xml.sax.InputSource(xmlDoc));
     
            HoteldataScanner scanner = new HoteldataScanner(document);
            scanner.visitDocument();
     
            jTFNom.setText(scanner.name); /** L'erreur est ici ! */
     
        }
    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
     
        void visitElement_name(org.w3c.dom.Element element) {
            // <name>
            // element.getValue();
            org.w3c.dom.NodeList nodes = element.getChildNodes();
            for (int i = 0; i < nodes.getLength(); i++) {
                org.w3c.dom.Node node = nodes.item(i);
                switch (node.getNodeType()) {
                    case org.w3c.dom.Node.CDATA_SECTION_NODE:
                        // ((org.w3c.dom.CDATASection)node).getData();
                        break;
                    case org.w3c.dom.Node.ELEMENT_NODE:
                        org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                        break;
                    case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                        // ((org.w3c.dom.ProcessingInstruction)node).getTarget();
                        // ((org.w3c.dom.ProcessingInstruction)node).getData();
                        break;
                    case org.w3c.dom.Node.TEXT_NODE:
                        // ((org.w3c.dom.Text)node).getData();
                        name = ((org.w3c.dom.Text)node).getData();
                        break;
                }
            }
        }
    Et l'erreur est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Exception in thread "main" java.lang.NullPointerException
    	at xxx.projet.BuildHotel.LoadData(BuildHotel.java:46)
    	at xxx.projet.BuildHotel.main(BuildHotel.java:289)
    J'espère que ça va t'aider

    Merci d'avance.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Il faudrait savoir où et comment est créée l'instance de JTextField stockée dans jTFNom. Ni comment est initialisée cette variable, si elle l'est bien...
    Déjà, le fait qu'elle soit static favorise les problèmes : tu peux y accèder n'importe quand, alors qu'elle n'est pas forcément déjà initialisée (avant que ton UI soit construite). Je subodore un problème de threads : l'UI se contruit dans le thread SWING (Event Dispatch Thread - EDT), alors que le reste (le chargement de données par loadData()) s'exécute dans un autre thread (le thread principal de l'application à priori) : du coup, selon les environnements, le code des 2 threads ne s'exécute pas à la même vitesse, et donc dans un cas, l'UI est prête et dans l'autre, pas, au moment où tu affectes le texte à jTFNom.

    Organise différemment le code :

    1. Au lancement, charge les données dans tes classes de manipulation, qui ne doivent pas avoir de références à la GUI
    2. Puis tu lances ton code de construction d'UI, sur l'EDT, par un SwingUtilisties.invokeLater(), en lui passant les données pour initialiser les champs


    En gros, en simplifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Data data = load();
    SwingUtilties.invokeLater( ()-> new MyFrame(data) );
    Éventuellement, pour te simplifier ton programme, tu peux aussi faire une classe statique pour tes datas, donc au moment de l'intialisation de l'UI tu pourras y faire référence directement (plus besoin de le passer en paramètre de "MyFrame").

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Data {
     
       private static Data data;
     
       public static void loadData(File file) {
          data = ...
       }
     
       public static Data getData() {
             return data;
       }
     
    }

    Sinon String xmlDoc = f.getAbsolutePath().substring(0, f.getAbsolutePath().length() - 1) + "hoteldata.xml";, c'est bizarre. Enlever un caractère d'un path (si c'est un / ou un \\, l'enlever ne donne pas le même chemin qu'avec, et si c'est autre chose, pourquoi serait-il là ?). Un truc dans le genre String xmlDoc = new File(f, "hoteldata.xml").getAbsolutePath(); devrait fonctionner aussi bien, sinon plus généralement.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Par défaut
    Ok ! J'ai noté ! Donc si j'ai bien compris entre les 2 (Eclipse et Netbeans) la gestion des threads ce fait différemment, étrangement étrange ??? Je n'aurai jamais imaginé une telle différence.

    Je voudrais rajouter un petit complément dans création et chargement de mes datas dont en voici le code :
    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
     
        public static void main(String args[]) throws ParserConfigurationException, IOException, SAXException {
            /* Set the Nimbus look and feel */
            //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
            /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
             * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
             */
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(BuildHotel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
     
            /* CREER ET AFFICHE LE FORMULAIRE */
            java.awt.EventQueue.invokeLater(() -> {
                new BuildHotel().setVisible(true);
            });
     
            /** CHARGE LES DONNEES DU FORMULAIRE */
            LoadData();
        }
    J'ai un peu voir beaucoup triché dans la création de mon formulaire c'est à dire que c'est Netbeans qui m'a généré le code et j'ai remarqué qu'il était noté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "Nimbus".equals(info.getName())
    J'ai une tout autre définition du mot "Nimbus" , tu saurais à quoi cela fait référence ?

    Merci pour tout !

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jb_One73 Voir le message
    Ok ! J'ai noté ! Donc si j'ai bien compris entre les 2 (Eclipse et Netbeans) la gestion des threads ce fait différemment, étrangement étrange ??? Je n'aurai jamais imaginé une telle différence.
    Ce n'est pas entre Eclipse et Netbeans, c'est entre 2 contextes d'exécutions différents : ça peut être 2 machines différentes (ou 2 configurations mémoire, processeur, etc..., 2 os différents, 2 instants différents (il peut se passer des choses en tâches de fond qui change la vitesse d'exécution), 2 codes différents (ton code va évolué, et tu n'auras peut être plus les mêmes conditions). À part nécessité absolue, il faut éviter que 2 threads manipulent les mêmes variables, et si on doit le faire, il y a des précautions à prendre).

    Citation Envoyé par Jb_One73 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
     
            /* CREER ET AFFICHE LE FORMULAIRE */
            java.awt.EventQueue.invokeLater(() -> {
                new BuildHotel().setVisible(true);
            });
     
            /** CHARGE LES DONNEES DU FORMULAIRE */
            LoadData();...
    Justement, là, on voit bien que tu lances l'UI dans l'EDT (le code commenté /* CREER ET AFFICHE LE FORMULAIRE */), qui va donc se lancer dans un thread à part... et le thread main continuant, il va appeler LoadData : aucune garantie que lorsque loadData() appellera jTFNom.setText(), jTFNom soit déjà initialisée.


    Citation Envoyé par Jb_One73 Voir le message
    J'ai un peu voir beaucoup triché dans la création de mon formulaire c'est à dire que c'est Netbeans qui m'a généré le code et j'ai remarqué qu'il était noté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "Nimbus".equals(info.getName())
    J'ai une tout autre définition du mot "Nimbus" , tu saurais à quoi cela fait référence ?
    Nimbus est le nom d'un thème d'UI (Look And Feel) : cela définit l'apparence et certains détails de fonctionnement de l'UI (on peut ainsi, avoir l'apparence d'avoir une UI MacOSX, ou Gnome, ou Windows ou autre...). Là, visiblement, NetBeans cherche à forcer le thème Nimbus s'il existe (Étonnamment, ce n'est pas fait dans l'EDT...pas bien).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Problème ouverture de fichiers avec NetBeans
    Par miouzeu dans le forum NetBeans
    Réponses: 5
    Dernier message: 19/09/2012, 17h11
  2. Problème de "transaction aborted" avec netbeans
    Par salisup dans le forum NetBeans
    Réponses: 0
    Dernier message: 03/06/2011, 12h12
  3. problème encodage des caractère avec netbeans
    Par space2alk dans le forum NetBeans
    Réponses: 3
    Dernier message: 19/07/2010, 16h34
  4. Mon problème avec NetBeans 5.0
    Par Djama dans le forum NetBeans
    Réponses: 1
    Dernier message: 22/05/2007, 23h12
  5. Réponses: 5
    Dernier message: 04/07/2006, 00h11

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