"AWT-EventQueue-0" java.lang.NullPointerException

Signaler
Messages postés
4
Date d'inscription
dimanche 9 mai 2010
Statut
Membre
Dernière intervention
6 janvier 2011
-
 Utilisateur anonyme -
Bonjour, je planche depuis de longues heure sur un problème..

J'aimerai faire passer un String d'une classe, dans une interface graphique. Lorsque je pensais avoir trouver la bonne solution, j'ai eu cette erreur :
"AWT-EventQueue-0" java.lang.NullPointerException
Sur cette ligne
		fenetreChat.messagesChat(MessagesServeur);


Je ne comprend pas, puis ce forum est mon dernier recours.

Je vous joins les codes des deux classes concernées pour les courageux..

Je voudrais faire passer un string de serveur à ChatServeur.
(Je précise que je ne suis pas expert JAVA ;))

package Echo;


import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;

public class serveur extends Thread{

private ServerSocket serveur;
public static ArrayList listeClients;
private static boolean stop=false;
private String MessagesServeur="test";

ChatServeur fenetreChat;

public serveur(ChatServeur fenetreChat,int portE){

super();
this.fenetreChat=fenetreChat;

listeClients = new ArrayList();

try {
serveur = new ServerSocket(portE);
} catch (IOException e) {
e.printStackTrace();
}
MessagesServeur = ("serveur à l'écoute sur le port : "+portE);
fenetreChat.messagesChat(MessagesServeur);

// Permet le dialogue avec le client
MessagesServeur = ("le serveur attend une connexion");
this.fenetreChat.messagesChat(MessagesServeur);
this.start();
if(stop){
this.stop();
}
}

public void run() {
int i =1;

while(true){
// Attente de la connexion d'un client(bloquant)
try {
Socket socketClient = serveur.accept();
ExoThread thread = new ExoThread(this,socketClient, i);
thread.start();
listeClients.add(thread);
MessagesServeur = ("*******Client "+i+" en ligne********");
this.fenetreChat.messagesChat(MessagesServeur);
i++;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

public void envoyerMessageAll(String chaine){

Iterator itr = listeClients.iterator();

while(itr.hasNext()){

ExoThread UnClient = (ExoThread) itr.next();
UnClient.envoyerMessage(chaine);

}

}

public static void main(String[] args) throws IOException {

}

public static void close() {
// TODO Auto-generated method stub
stop=true;
}
}


package Echo;



import java.io.PrintWriter;
import java.lang.*;
import java.net.Socket;
import java.util.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;


public class ChatServeur {
final static int DECONNECTE = 0;
final static int CONNECTION = 1;
final static int CONNECTE = 2;

private static JFrame Fenetre = null;
private static JTextArea chatText = null;
private static JLabel statusBar = null;
private static JTextField ipField = null;
private static JTextField portField = null;

// Connection info
private static String hostIP = "localhost";
private static int port = 1999;
private static int connectionStatus = DECONNECTE;
public static boolean isHost = true;
private static ArrayList listePseudo = new ArrayList();
private static ArrayList listeClients;
private static int nbClient = 0;
private static JButton coButton = null;
private static JButton decoButton = null;

serveur srv;

public ChatServeur(serveur s){
super();
this.srv=s;
}

private static JPanel initOptionsPane() {
JPanel pane = null;
ActionAdapter buttonListener = null;

JPanel optionsPane = new JPanel(new GridLayout(4, 1));

// IP address in
pane = new JPanel(new FlowLayout(FlowLayout.RIGHT));
pane.add(new JLabel("Host IP:"));
ipField = new JTextField(10); ipField.setText(hostIP);
ipField.setEditable(true);
pane.add(ipField);
optionsPane.add(pane);

// Port in
pane = new JPanel(new FlowLayout(FlowLayout.RIGHT));
pane.add(new JLabel("Port:"));
portField = new JTextField(10); portField.setEditable(true);
portField.setText((new Integer(port)).toString());
pane.add(portField);
optionsPane.add(pane);

JPanel buttonPane = new JPanel(new GridLayout(1, 2));
buttonListener = new ActionAdapter() {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("connection")) {
decoButton.setEnabled(true);
coButton.setEnabled(false);
connectionStatus = CONNECTION;
statusBar.setText("Serveur Online");
Fenetre.repaint();
new serveur(null, Integer.parseInt(portField.getText()));
chatText.append("Serveur à l'écoute sur le port" +portField.getText()+"\n");
}
// Deco
else {
coButton.setEnabled(true);
decoButton.setEnabled(false);
connectionStatus = DECONNECTE;
nbClient--;
statusBar.setText("Offline");
serveur.close();
Fenetre.repaint();
chatText.append("Serveur déconnecté \n");
}
}
};
coButton = new JButton("Connection");
coButton.setMnemonic(KeyEvent.VK_C);
coButton.setActionCommand("connection");
coButton.addActionListener(buttonListener);
coButton.setEnabled(true);
decoButton = new JButton("deconnexion");
decoButton.setMnemonic(KeyEvent.VK_D);
decoButton.setActionCommand("deconnexion");
decoButton.addActionListener(buttonListener);
decoButton.setEnabled(false);
buttonPane.add(coButton);
buttonPane.add(decoButton);
optionsPane.add(buttonPane);

optionsPane.add(pane);


return optionsPane;
}

private static void initGUI() {
statusBar = new JLabel();
statusBar.setText("Serveur Offline");

JPanel optionsPane = initOptionsPane();

JPanel chatPane = new JPanel(new BorderLayout());
chatText = new JTextArea(10, 20);
chatText.setLineWrap(true);
chatText.setEditable(false);
chatText.setForeground(Color.blue);
chatText.append("bienvenue sur le serveur \n");
JScrollPane chatTextPane = new JScrollPane(chatText,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
chatPane.add(chatTextPane, BorderLayout.CENTER);
chatPane.setPreferredSize(new Dimension(220, 100));

JPanel mainPane = new JPanel(new BorderLayout());
mainPane.add(statusBar, BorderLayout.SOUTH);
mainPane.add(optionsPane, BorderLayout.WEST);
mainPane.add(chatPane, BorderLayout.CENTER);

Fenetre = new JFrame("Chat");
Fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Fenetre.setContentPane(mainPane);
Fenetre.setSize(Fenetre.getPreferredSize());
Fenetre.setLocation(200, 200);
Fenetre.pack();
Fenetre.setVisible(true);

}

public static void main(String args[]) {
initGUI();

}

public void messagesChat(String messagesServeur) {
// TODO Auto-generated method stub
chatText.append(messagesServeur+"\n");
}

}


7 réponses

Messages postés
131
Date d'inscription
samedi 6 janvier 2007
Statut
Membre
Dernière intervention
4 janvier 2011
2
Bonjour,

	buttonListener = new ActionAdapter() {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("connection")) {
                                        [...]
new serveur(null, Integer.parseInt(portField.getText()));
[...]
}


Tu créer donc une nouvelle instance de "serveur" avec en premier paramètre null ...

public serveur(ChatServeur fenetreChat,int portE){
[...]
fenetreChat.messagesChat(MessagesServeur);


Que tu récupères et tu fait messageChat() sur un objet null.
Donc a l'exécution, tu as un pointeur null, et null ne peut pas effectuer cette fonction évidemment...
(je n'ai pas lu le reste du code)

Bye
Messages postés
4
Date d'inscription
dimanche 9 mai 2010
Statut
Membre
Dernière intervention
6 janvier 2011

Oui, j'avais remarqué ça, j'avais mis this avant, mais ça me générait des erreur avec une classe adapter..
Messages postés
131
Date d'inscription
samedi 6 janvier 2007
Statut
Membre
Dernière intervention
4 janvier 2011
2
Bonjour,

Si tu as compris alors ne met pas null mais this. Ton problème de "classe adapter" viens après.
Avoir tout en static c'est très moche. Je te conseil de commencer par créer une instance de ChatServeur dans ton main (main sera donc la SEULE fonction statique).
Enleve aussi tout les static devant tes variables (tu peux les laisser devant les variables "final" puisque celle-ci sont réellement static).

Avec tes static partout en fait, tu ne créer jamais d'objet de ta classe "ChatServeur".
Je te conseil fortement d'apprendre/revoir les bases de la programmation orienté objet, et les bases du java sinon tu risques d'avoir encore beaucoup d'erreurs de ce style là.
Il faut bien comprendre que "public static" est à la "class" ce que "private" est à l'instance.

Voila, bonne lecture, bon courage et à bientôt

(Si tu as encore des erreurs comme ton "classe adapter", poste à la suite les logs d'erreurs. J'pourrais parier sur un ClassCastException du aux "static"s)
Messages postés
4
Date d'inscription
dimanche 9 mai 2010
Statut
Membre
Dernière intervention
6 janvier 2011

Je ne peut pas virer tout les static, ça me génère des erreurs et ce que me propose eclipse, c'est de remettre un static devant..

Sinon j'ai fait ce qui est écrit et là le constructeur de la classe serveur s'est modifié..

public serveur(ActionAdapter actionAdapter, int portE){


Voilà le fameux "ActionAdapter"
Messages postés
131
Date d'inscription
samedi 6 janvier 2007
Statut
Membre
Dernière intervention
4 janvier 2011
2
Tu es têtu où tu fais exprès ?
Bon, si tu veux rester avec tes statics partout, regarde aussi quand tu créer ton instance serveur.
Le this que tu utilises dans l'"actionPerformed" et relatif à ton "buttonListener" qui est déclaré en tant que ActionAdapter.

Au vu de ton code il n'y a aucune correction possible parce que :
- Double inclusion : new seveur(new ChatServeur(new serveur(... => ça rime à rien du tout.
- Tu n'a créer aucune instance de ChatServeur pour le moment (d'ailleurs vu le premier point, c'est tout bonnement impossible.
- Il y a des statics partout, autant ne pas coder avec un langage objet !

Donc je te conseil de rajouter à la liste des choses à apprendre les "méthodes de conception" (prends celle que tu veux, mais conçoit un minimum avant de coder, sinon ça rime à rien).

Bon courage
Bye
Messages postés
4
Date d'inscription
dimanche 9 mai 2010
Statut
Membre
Dernière intervention
6 janvier 2011

Ok, merci beaucoup pour l'aide. ;)
bye

Bonjour

Je rejoins lural, ce code est dégoûtant. Par pitié, fais une vraie conception avant de pisser du code. Là, ça ne rime à rien.