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

Entrée/Sortie Java Discussion :

problème de NULL pour envoi d'un objet via une socket


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    problème de NULL pour envoi d'un objet via une socket
    essayant d'envoyer un objet via d'un thread server vers un client par ObjectOutputStream, je reçoit une exception
    Exception in thread "Thread-4" java.lang.NullPointerException
    en déboggant, j'ai remarqué que l'objet de la méthode d'envoi obj est null, comme s'il n'a pas été remplace par celui passé en paramètres car pub n'est pas null, pourtant le même code fonctionnait avant que je mette le serveur dans un thread à part.

    Serveur
    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
     
    Socket socket;
    ServerSocket srv;
    Participant Ui;  //un client
    List<Participant> participants = new ArrayList<>(); //liste de clients
    Publication pub = new Publication(this.data); //objet à envoyer
    //thread serveur
    Runnable serverTask = () -> {
     
                  try {
                        srv = new ServerSocket(Integer.valueOf(txtPort.getText()));
     
     
                        for (int i = 0; i < nbrParticipants; i++) {
                            //serveur accepte la connexion d'un participant
                            socket = srv.accept();
                            Ui = new Participant(nonce, socket);
                            //ajouter le participant à connecté à la liste
                            participants.add(Ui);
     
     
                            //lancement du thread du nouveau participant
                            Thread thread = new Thread(Ui);
                            thread.start();
     
     
                            //incrémente le compteur afin d'attribuer un nouveau Id
                            nonce++;
                        }
     
     
                        //attendre que tous les candidats se connectent
                        //pour envoyer les données 
                        for (int i = 0; i < participants.size(); i++) {
                            participants.get(i).send(pub); //erreur exception ici
                        }
     
     
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                };
    Thread serverThread = new Thread(serverTask);
    serverThread.start();


    méthode send()
    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
     
    public class Participant implements Runnable {
        public void run() {        try {
                oos = new ObjectOutputStream(cnx.getOutputStream());
                ois = new ObjectInputStream(cnx.getInputStream());
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
     
        public void send(Object obj) {
            try {
                oos.writeObject(obj);
                oos.flush();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }   
    }

  2. #2
    Modérateur

    Salut,

    Je ne vois pas l'intérêt de mettre Participant Ui; //un client en attribut global, cela ne te sert pas et ne fera que te créer des bugs.
    D'où provient le nombre de participant nbrParticipants ?
    D'où provient le cnx ?

    A+
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Membre habitué
    J'ai pu résoudre le problème du NULL, il s'agissait d'une erreur de synchronisation, car l'envoi du message démarrait avant le run où j'initialisait les ObjectStream, donc ils étaient NULL.

    Merci pour votre observation concernant la déclaration de l'objet en global, effectivement vous avez tout à fait raison, je l'ai déplacé.

###raw>template_hook.ano_emploi###