Salut!!
Je voudrais savoir que signifie l'erreur:java.lang.NullPointerException?!!
(elle apparît quand j'exécute mon code et j'ai pa su la corriger)
Merci pour votre aide!!!
Salut!!
Je voudrais savoir que signifie l'erreur:java.lang.NullPointerException?!!
(elle apparît quand j'exécute mon code et j'ai pa su la corriger)
Merci pour votre aide!!!
Bonjour,
cette erreur survient qu'on appel une méthode sur une variable non initialisée.
Par exemple :
MonObjet tmp;
tmp.uneMethode();
Provoque une nullPointerException.
Pour pouvoir aider il faudrait nous montrer le code source.
Hello,
Si tu veux plus d'infos sur la cause, donne nous la partie de ton code qui pose problème et le stacktrace complet de l'erreur...
A+
généralement, cette exception est levée lorsque tu essaie d'appeler une méthode sur un objet qui n'est pas initialisé. Un exemple
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 public class MonObjet{ public MonObjet() { ... } public int uneMethode(){ ... } public static void main(String[] args){ MonObjet o; int valeur = o.uneMethode(); }
Plus généralement, cette exception apparaît lorsque tu utilises un objet null là où tu ne devrais pas.
Autre exemple : ajout d'un null à une Collection ne les acceptant pas.
voila mon code:
dans la classe principale:
et dans ma classe Sys, voici la méthode ecoute:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public void actionPerformed(ActionEvent e) { String texte = saisie.getText(); saisie.selectAll(); saisie.cut(); ajouter(login, texte); Sys.ecoute(login, texte); //répondre en fonction du texte saisi }
Voila, merci!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public synchronized void ecoute(String login, String texte) { //pouvoir faire un pré-traitement du texte (lemmatisation pas exemple) texte = " \"" + texte.replace('"','\'') + "\" "; String fact = "(enoncestr " + login + texte + ")"; notify(); }
où est levé l'exception ? sur saisie.selectAll() ? sans cela, on pourra pas trop t'etre utile
non sur sysRete.ecoute(login, texte)
ta variable/attribut sys a bien été initialisée ? fais un
la ligne juste avant, tu seras fixé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 System.out.println(sys == null);
Elle a été initialisé dans le main:
Quand j'ajoute la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part sys = new Sys(var, rulefile, "");
l'exception est toujours levée!
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.out.println(sys == null);
Je pense qu'il nous faut plus de code pour situer le probleme
oui un peu plus de code aiderait
Mon code est très long mais voici des bouts que je pense significatifs:
la classe main:
voici toute ma classe Sys:
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 public static void main(String[] args) { String rulefile =""; System.out.println("Starting " + rulefile + "...");//affichage dans la console // Instanciation de l'interface graphique test decision = new test(); // Instanciation du moteur de dialogue Sys sys = new Sys(var, rulefile, ""); sys.ouverture(login); }
sachant que j'ai une autre classe qui utilise une autre méthode actionPerformed donc je ne sais pas si le problème viendrait de là?!!
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141 private Rete rete; private Thread thread; private Vector factsFile; public Sys(SysInterface application, String ruleFile, String sysreteSavedFacts) { try { rete = new Rete(); rete.store("APPLICATION", application); // Charger les bases de connaissances charger(ruleFile); rete.reset(); if (!sysreteSavedFacts.trim().equals("")) { chargerFaits(sysreteSavedFacts); // Impérativement après le reset() } factsFile = new Vector(); thread = new Thread(this); thread.start(); } catch (JessException e) { e.printStackTrace(); } } private void executeCommand(String command) { try { rete.executeCommand(command); } catch (JessException e) { e.printStackTrace(); } } private void charger(String fileName) { String sep = System.getProperty("file.separator"); String absoluteFileName = System.getProperty("user.dir") + sep + fileName; absoluteFileName = absoluteFileName.replace('\\', '/'); String commande = "(batch " + '"' + "C:/Documents and Settings/user/Bureau/JESS/minidialogueur/data/exemple.clp" + '"' + ")"; executeCommand(commande); } /** * Pour sauvegarder la base de faits */ public void sauverFaits(String filename) { executeCommand("(save-facts " + filename + ")"); } /** * Pour recharger la base de faits */ public void chargerFaits(String filename) { System.out.println("\nChargement du fichier de regles conversationnelles: " + filename); executeCommand("(load-facts " + filename + ")"); //executeCommand("(facts)"); // Enlever les commentaires pour visualiser la base de faits } protected synchronized void attente() { try { while((factsFile.size() == 0)) wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // //////////////////////////////////////// // Actions à transmettre à la base de faits // //////////////////////////////////////// public synchronized void ecoute(String login, String texte) { //pouvoir faire un pré-traitement du texte (lemmatisation pas exemple) System.out.println("test zffectué"); texte = " \"" + texte.replace('"','\'') + "\" "; String fact = "(enoncestr " + login + texte + ")"; factsFile.addElement(fact); notify(); } public synchronized void donne(String login, String type, String ident) { String fact = "(objet (login " + login + ") (type " + type + ") (ident " + ident + "))"; factsFile.addElement(fact); notify(); } public synchronized void ouverture(String login) // Invoquée dans initialiseToi de mepa.serveur.Scene { String fact = "(ouverture " + login + ")"; factsFile.addElement(fact); notify(); } ////////////////////////////////////////// protected String faitSuivant() { synchronized(factsFile) { return (String) factsFile.remove(0); } } public void run() { while(true) { attente(); String fact = faitSuivant(); try { rete.assertString(fact, rete.getGlobalContext()); rete.run(); } catch (JessException e) { e.printStackTrace(); } } } }
Merci pour votre aide!!
Mais elle est levée où l'exception par rapport au code que tu nous donne ?
Bien, donc dans ton main tu créé une instance de Sys :
// Instanciation du moteur de dialogue
Sys sys = new Sys(var, rulefile, "");
mais à quel moment elle est transmise pour le code suivant :
public void actionPerformed(ActionEvent e)
{
String texte = saisie.getText();
saisie.selectAll();
saisie.cut();
ajouter(login, texte);
Sys.ecoute(login, texte); //répondre en fonction du texte saisi
}
Elle est levée dans la méthode actionPerformed qui se trouve dans la classe principale:au niveau de la ligne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public void actionPerformed(ActionEvent e) { String texte = saisie.getText(); saisie.selectAll(); saisie.cut(); ajouter(login + " >", texte); System.out.println(sysRete == null); sys.ecoute(login, texte); //répondre en fonction du texte saisi }
Code : Sélectionner tout - Visualiser dans une fenêtre à part sys.ecoute(login, texte);
Non je parle pas de quand est déclenchée l'execption.
Mais pour que le code
sys.ecoute(login, texte);
ne déclence pas d'execption, il faut que le variable : sys, qui est utilisée à ce moment soit initialisée.
Avec le seul code que tu nous montre on ne voit qu'une initiliation, qui se trouve dans la méthode main :
Sys sys = new Sys(var, rulefile, "");
Cette ligne créée une varialbe locale à la méthode main, ayant pour nom : sys, et lui met une nouvelle instance de Sys.
Si tu ne transmet cette variable initiliasée à la classe qui l'utiliser par la suite c'est normal que tu es une exception
En fait dès que la fenêtre apparait, il y a du texte qui est affiché (jusque là ça marche ) dans ce cas je dois taper moi à mon tour du texte aux quel le programme doit répondre (c'est comme ça que le programme fonctionne), mais dés que je tape mon texte et que j'appuie sur "entrée" l'exception est levée!!
j'espère que c'est plus clair!
voici la partie du code responsable de la levée d'exception:
cette partie de code se trouvait dans le main mais je ne vous l'ai pas posté parce que je pensais que ça n'avait rien avoir avec le problème!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception e) { System.out.println(e.toString()); }*/
Désolée et merci encore!! (vos remarques m'ont permis de revoir tout le code et de trouver la cause du problème)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager