Du vector à la NullPointerException, pourquoi ?

Du vector à la NullPointerException, pourquoi ? - Java - Programmation

Marsh Posté le 02-11-2005 à 21:20:51    

Je suis en train de faire un petit programme d'échange de fichiers, pour
l'instant ce n'est que je début mais je rencontre déja un problème.
 
J'essai de transférer des objets Réponse (voir le code ci-dessous) entre
un serveur et un client. Je rencontre un problème au niveau du serveur
mais je n'arrive pas du tout à comprendre quelle en est la raison. Je
poste ici car j'ai passé mon aprés-midi à essayer de trouver la
solution :sweat:  
 
Selon les traces d'exécution le client arrive bien a créer un objet
réponse, à l'instancier et à l'utiliser. Tout le contraire du serveur
qui créer l'objet, l'instancie mais ne peut l'utiliser... Avez vous une
idée ?
 
Merci de votre aide.
 
L'exécution du serveur :


---------Demarrage Server---------
 
Ouverture du serveur : 2024
>> Connection du client : /127.0.0.1
chiffre : 1
Exception in thread "main" java.lang.NullPointerException
       at Reponse.setCode(Reponse.java:15)
       at FTPRequest.<init>(FTPRequest.java:34)
       at Server.<init>(Server.java:38)
       at Server.main(Server.java:71)


 
L'exécution du client :  


---------Demarrage Client---------
 
chiffre : 1
 
 
!!!! Erreur de connection !!!!
 
 
Impossible de se connecter au serveur.
Verifiez que le logiciel serveur est bien lance sur l'hote
distant.


 
 
Le code de la classe réponse :  

Code :
  1. import java.util.*;
  2. import java.lang.*;
  3. public class Reponse implements java.io.Serializable{
  4. protected Vector <String> answer;
  5. protected boolean codeOk = false;
  6. public void Reponse(){
  7. answer = new Vector <String> ();
  8. }
  9. public void setCode(int code){
  10. System.out.println("chiffre : " +String.valueOf(code));
  11. System.err.println("size = "+answer.toString());
  12. answer.add(String.valueOf(code));
  13. codeOk = true;
  14. }
  15. public void setData(String m){
  16. if(codeOk && answer.size()!=0)
  17. answer.add(m);
  18. }
  19. public int getCode(){
  20. return Integer.parseInt(answer.elementAt(0).toString());
  21. }
  22. public int getNbElement(){
  23. return answer.size();
  24. }
  25. public String getFirstElement(){
  26. return getDataAt(1);
  27. }
  28. public String[] getData(){
  29. String[] rep = new String[answer.size()-1];
  30. if(codeOk && answer.size()>1){
  31. for(int i = 1; i < answer.size() ; i++)
  32. rep[i-1]=answer.elementAt(i).toString();
  33. return rep;
  34. }
  35. return null;
  36. }
  37. public void afficherData(){
  38. if(codeOk && answer.size()>2){
  39. System.out.println("> "+answer.elementAt(0).toString()+" :
  40. "+answer.elementAt(1));
  41. for(int i = 1; i < answer.size() ; i++)
  42. System.out.println("  "+answer.elementAt(i));
  43. }
  44. }
  45. public String getDataAt(int i){
  46. if(codeOk && answer.size()>1 && i < answer.size() && i > 0)
  47. return answer.elementAt(i).toString();
  48. else
  49. return null;
  50. }
  51. public String getCmd(){
  52. String request = this.getDataAt(1);
  53. int index = request.indexOf(' ');
  54. if (index != -1)
  55. return request.substring(0, index).toUpperCase();
  56. else
  57. return request.toUpperCase();
  58. }
  59. public String getArg(){
  60. String arg = this.getDataAt(1);
  61. int index = arg.indexOf(' ');
  62. if(index != -1)
  63. return this.getDataAt(1).substring(index + 1);
  64. else
  65. return null;
  66. }
  67. }


 
 
 
Le code du client :

Code :
  1. import java.io.*;
  2. import java.net.*;
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.lang.Thread;
  6. import java.lang.Object;
  7. public class Client extends Thread {
  8. /** Socket du client**/
  9. private Socket sock;
  10. /** Buffer d'entree des informations serveur (messages)*/
  11. private ObjectInputStream in;
  12. /** Messages envoyes par le serveur */
  13. private Reponse reponse;
  14. /** Port utilise par defaut par le client*/
  15. public static final int PORT = 2024;
  16. /** Port utilise par le client pour se connecter au serveur*/
  17. public static int port;
  18. /** Port utilise par le client pour se connecter au serveur*/
  19. public static InetAddress adrServ ;
  20. /**  Constructeur de l'objet Client
  21.   @param sock socket du serveur*/
  22. public Client(Socket sock) throws Exception {
  23. this.sock = sock;
  24. in = new ObjectInputStream(this.sock.getInputStream());
  25. }
  26. /** Thread de reception et de traitement des messages et donnees
  27. serveur */
  28. public void run() {
  29. while (true) {
  30. try {
  31. reponse = (Reponse) in.readObject() ;
  32. } catch (Exception e) {}
  33. if(reponse.getCode()==0){
  34. System.err.println("Connection Terminee" );
  35. System.exit(0);
  36. }
  37. System.out.println("> "+reponse.getCode()+" :
  38. "+reponse.getDataAt(1));
  39. for(int i = 2; i < reponse.getNbElement() ; i++)
  40. System.out.println("  "+reponse.getDataAt(i));
  41. }
  42. }
  43. /** Methode main : lance le Thread de reception et
  44.  envoie les commandes entrees par l'utilisateur vers le serveur.
  45.   @param args parametres du client */
  46. public static void main(String args[]) {
  47. String sentence;
  48. System.out.println("---------Demarrage Client---------" + '\n');
  49. if (args.length > 2) {
  50. System.err.println("Usage: Client ou Client [ port ] ou Client
  51. [ port ] [ ip serveur] " );
  52. System.exit(1);
  53. }
  54. port = PORT;
  55. if (args.length >= 1) {
  56. port = Integer.parseInt(args[0]);
  57. }
  58. try{
  59. adrServ=InetAddress.getLocalHost();
  60. if (args.length == 2) {
  61. adrServ = InetAddress.getByName(args[2].toString());
  62. }
  63. }
  64. catch(Exception e){
  65. System.err.println("!!! Erreur : Le cerveur cible n'existe pas.\n" );
  66. }
  67. try {
  68. Socket clientSocket = new Socket(adrServ, port);
  69. ObjectOutputStream out = new
  70. ObjectOutputStream(clientSocket.getOutputStream());
  71. out.flush();
  72. Client c = new Client(clientSocket);
  73. BufferedReader inFromUser = new BufferedReader(new
  74. InputStreamReader(System.in));
  75. Reponse commande = new Reponse();
  76. commande.setCode(1);
  77. c.start();
  78. while (true) {
  79. sentence = inFromUser.readLine();
  80. commande.setData(sentence);
  81. out.writeObject(commande);
  82. }
  83. } catch (Exception e) {
  84. System.err.println("\n\n!!!! Erreur de connection !!!!\n" );
  85. System.err.println("\nImpossible de se connecter au serveur." );
  86. System.err.println("Verifiez que le logiciel serveur est bien lance
  87. sur l'hote distant.\n\n" );
  88. }
  89. }
  90. }


 
Le code du serveur (une partie) :

Code :
  1. import java.net.*;
  2. import java.io.*;
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.lang.reflect.*;
  6. public class FTPRequest extends Thread{
  7. /** Tampon d'entree des commandes client */
  8. protected ObjectInputStream in;
  9. /** Flux de sortie vers le client */
  10. protected ObjectOutputStream out;
  11. /** Socket attache au client */
  12. private Socket sock;
  13. protected Reponse com;
  14. protected Reponse reponse;
  15. /** Constructeur du constructeur du gestionnaire de requete FTP.
  16.     @param sock socket attache au client.
  17.     @param f dossier de demarrage du serveur. */
  18. public FTPRequest(Socket sock, String f) throws Exception {
  19. this.sock = sock;
  20. out = new ObjectOutputStream(this.sock.getOutputStream());
  21. out.flush();
  22. in = new ObjectInputStream(this.sock.getInputStream());
  23. reponse = new Reponse();
  24. com = new Reponse();
  25. com.setCode(1);
  26. reponse.setCode(1);
  27. this.start();
  28. }
  29. /** Constructeur thread serveur.
  30.      */
  31. public void run() {
  32. try{
  33. reponse.setData("220 localhost FTP server ready.\n" );
  34. out.writeObject(reponse);
  35. this.processRequest();
  36. }
  37. catch(Exception e){}
  38. }
  39. /** Methode principale du gestionnaire de requete FTP.*/
  40. private void processRequest() throws Exception {
  41. int i = 2;
  42. while (com.getCode()!=90) {
  43. com = (Reponse) in.readObject();
  44. reponse.setCode(i);
  45. i++;
  46. out.writeObject(reponse);
  47. }
  48. sock.close();
  49. }
  50. }


Reply

Marsh Posté le 02-11-2005 à 21:20:51   

Reply

Marsh Posté le 02-11-2005 à 21:35:12    

il me semble que le NPE vient du fait que ton Vector est vide
 
je sais pas trop pourquoi, mais j'ai eu a peu près la même chose avec une LinkedList<String>
 
avant et après l'instanciation par new LinkedList<String>(), je faisais un test par un autre thread
sur (maListe!=null) et qui me répondait toujours true
 
donc ta ligne 15 dans Reponse.java peut faire la même erreur
essaie de faire un test sur answer.size()>0 (qui marche mieux que (answer!=null) du coup)
et d'afficher answer.toString que si le résultat est vrai
 
mais alors pourquoi il dit que answer et mon truc à moi sont null, je sais pas pourquoi et même, je comprends pas  :heink:


---------------
The Rom's, à votre service
Reply

Marsh Posté le 02-11-2005 à 21:39:55    

public void Response() ?
 
skoi ce constructeur avec un type de retour ? c'est legal, ca, en java ?

Reply

Marsh Posté le 02-11-2005 à 21:51:59    

ah ben ouais ca viens de là
public void Reponse() c'est une méthode
et public Reponse() il instancie pas ton Vector !
(genre le constructeur de base)
 
mais ca trouve pas plus d'explications à mon truc ca, dommage


---------------
The Rom's, à votre service
Reply

Marsh Posté le 02-11-2005 à 21:53:40    

Mais quel con je suis :fou:  
 
Bon désolé... d'un coté je ne ferais plus l'erreur.
 
Merci à tous deux pour votre aide et à chrisbk pour la solution :hello:

Reply

Marsh Posté le 02-11-2005 à 21:56:12    

mais c'est la méthode avec le même nom que la classe qui me semble bizarre
ou alors c'est vraiment un constructeur qui renvoie un void donc un null,
mais apparement non, sinon l'exec aurait bloqué à "com.setCode(1);"
dans FTPRequest.<init>(FTPRequest.java:34)


---------------
The Rom's, à votre service
Reply

Marsh Posté le 03-11-2005 à 16:53:53    

En fait c'était juste le constructeur... Programmant avec vim je n'ai pas de création automatique de fichier .java comme avec un ide plus développé :whistle:

Reply

Marsh Posté le 03-11-2005 à 17:01:02    

Citation :

Du vector à la NullPointerException, pourquoi ?


titre d'un chapitre tiré de mon nouveau bouquin : "les NPE viennent de Mars et les IAE viennent de Venus" [:pingouino]


---------------
trainoo.com, c'est fini
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed