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

Java EE Discussion :

Erreur java.io.EOFException lors de l'execution


Sujet :

Java EE

  1. #1
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 583
    Par défaut Erreur java.io.EOFException lors de l'execution
    Bonjour à tous j'ai cette erreur pourriez vous m'aider,dan s ma servlet quand je désérialize mon objet:
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    Joueur=(PanneauScore)entree.readObject();
    comme ceci cela m'affiche l'erreur java.io.EOFException quand je m'est cette instruction en commentaire je n'ai plus l'erreur.Voici ma méthode dopost

    Code JAVA : 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
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    	try {
    		// Récupération du flux d'entrée envoyé par l'applet
    		ObjectInputStream entree=new ObjectInputStream(request.getInputStream());
    		Joueur=(PanneauScore)entree.readObject();
    	   //  this.nom = Joueur.getNom_meilleur_joueur();
    		//nom=(String)entree.readObject();
    		// Préparation du flux de sortie
    		ObjectOutputStream sortie=new ObjectOutputStream(response.getOutputStream());
    		// Execution de la requête
    			sresultat=ExecuterRequete();
    			sresultat.first();
    			// Envoi du résultat au client
    			sortie.writeObject(sresultat);
    		sresultat.first();
     
    	} catch (Exception ex) {
    	System.out.println("Erreur d'exécution de la requête SQL*: "+ex);
    	}
    }

    l'erreur est renvoyé par mon applet lors de la connection provient de mon applet :

    Code JAVA : 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
      public void Connect_Servlet() {
    		String res;
    		String nom=txtAaa.getText();
    		try
    		{ 
    			// Connexion à la servlet
    			URL url=new URL("http://localhost:8080/tetris/requete");
    			URLConnection connexion=url.openConnection();
    			connexion.setDoOutput(true);
    			// Récupération du flux de sortie
    		    ObjectOutputStream fluxsortie = new ObjectOutputStream(connexion.getOutputStream());
    			// Envoi du nom à rechercher
    			fluxsortie.writeObject(nom);
    			// Récupération du flux d’entrée
    			ObjectInputStream fluxentree = new ObjectInputStream(connexion.getInputStream());
    			// Récupération du résultat de la requête
    			SerializedResultSet donnees=(SerializedResultSet) fluxentree.readObject();
    			// affichage du résultat
    			donnees.first();
    			Vector contenu=new Vector();
    			contenu.clear();
    			listeResultat.setListData(contenu);
    			for (int i=0; i<donnees.recordCount();i++)
    			{
    				this.BestJoueurs[i] = donnees.getString("nom"); 
    				this. Attributs[i][1] = Integer.parseInt(donnees.getString("score"));
    				this.Attributs[i][0] = Integer.parseInt(donnees.getString("niveau"));
    				//contenu.addElement(res);
    				donnees.next();
     
    			}
     
     
    			//listeResultat.setListData(contenu);
     
    		}
    		catch (Exception sql)
    		{
    			System.out.println("erreur  "+sql);
    		}
     
    	}

    si vous pouviez m'aider merci.

  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,

    Ferme tes flux (méthode InputStream.close() et outputStream.close(), ou utilise un try-with-resource). Tant que le flux de sortie n'a pas été fermé, tu ne peux être sûr que tout ce qui se trouve dans les buffers a bien été envoyé. On peut utiliser flush() aussi pour forcer le vidage, mais de toute manière, il est indispensable de toujours fermer ses flux : c'est une habitude à prendre, pour éviter différents problèmes (comme des fichiers qui restent verrouillés par exemple, ou des ressources qui occupent inutilement de la mémoire, des buffers en attente, etc...).
    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 Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 583
    Par défaut
    Merci de votre réponse j'ai fais ce que vous m'avez dit voila la fonction j'ai changer quelques truc pour que ce soit plus compréhenisble:

    Code JAVA : 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
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    	try {
    		// Récupération du flux d'entrée envoyé par l'applet
    		ObjectInputStream entree=new ObjectInputStream(request.getInputStream());
    		while((Joueur=(Joueur)entree.readObject()) != null){
     
    	     this.nom = Joueur.getNom();
    	     this.Score = Joueur.getScore();
    	     this.niveau = Joueur.getNiveau();
    		}
    	     entree.close();
     
    		// Préparation du flux de sortie
    		ObjectOutputStream sortie=new ObjectOutputStream(response.getOutputStream());
    		// Execution de la requête
    			sresultat=ExecuterRequete();
    			sresultat.first();
    			// Envoi du résultat au client
    			sortie.writeObject(sresultat);
    		sresultat.first();
    		sortie.flush();
    		sortie.close();
    	} catch (Exception ex) {
    	System.out.println("Erreur d'exécution de la requête SQL*: "+ex);
     
     
    	} 
    }

    j'ai la même erreur renvoyé par mon applet,je pense avoir une idée j' envois l'objet joueur seulement à la fin de partie avant sa je me connect a la servlet juste pour récupérer les score de ma base,donc quand on va dans dopost mon objet joueur n'a pas encore était sérializé l'ennui c'est que je ne sais pas comment vérifier quel objet est envoyé a travers la sérialization ainsi si je peux vérifier que l'objet joueur a était envoyer je peux lancer les traitements adéquates si vous pouviez m'aider s'il vous plaît?

  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
    Bon, déjà, le close() il faut qu'il soit toujours exécuté, même s'il y a une exception, ce qui n'est pas le cas dans ton code.

    Soit on fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try {
       InputStream stream = ... // ou OutputStream, ou Reader, ou Writer...
       try {
     
        // lecture ou écriture
     
       } finally {
         stream.close();
       }
    } catch(IOException e) { // ou un throws dans la signature de la méthode
       ... traitement de l'exception
    }
    Soit avec le try-with-resource :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try ( InputStream stream ... ) {
     
        // lecture ou écriture
     
    } catch(IOException e) {
       ... traitement de l'exception
    }
    Ensuite pour savoir ce qu'il y a dans tes flux de requête, tu peux y mettre un paramètre (dans le header) qui dit quel type d'objet on doit lire dans le flux. Ou alors dans le flux, tu mets une entête qui décrit le type de l'objet transporté (un nombre fixe d'octets au sens défini et interpretable).
    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 Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 583
    Par défaut
    j'ai fais ce que vous m'avais dit esque c'est correct? :
    Code JAVA : 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
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    	try {
    			// Récupération du flux d'entrée envoyé par l'applet
    			ObjectInputStream entree=new ObjectInputStream(request.getInputStream());
    			// Préparation du flux de sortie
    			ObjectOutputStream sortie=new ObjectOutputStream(response.getOutputStream());
    			try{
    				Joueur=(Joueur)entree.readObject();
     
    			    this.nom = Joueur.getNom();
    			    this.Score = Joueur.getScore();
    			    this.niveau = Joueur.getNiveau();
    				// Execution de la requête
    				sresultat=ExecuterRequete();
    			    sresultat.first();
    				// Envoi du résultat au client
    				sortie.writeObject(sresultat);
    				sresultat.first();
    		    } finally {
     
    				sortie.flush();
    				sortie.close();
    				entree.close();
    		    }
    	    } catch (Exception ex) {
    	    	System.out.println("Erreur d'exécution de la requête SQL*: "+ex);
     	    }  
    }

    pour l' envoi de mon objet je le fait via cette fonction :

    Code JAVA : 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
    /*Méthode permettant l'enregistrement du score du joueur dans 
      la base si celui ci est dans les 5 premiers*/
      public void Enregistrement_Score(Joueur j) {
    		String res; 
     
    		try
    		{ 
    			// Connexion à la servlet
    			URL url=new URL("http://localhost:8080/tetris/requete");
    			URLConnection connexion=url.openConnection();
    			connexion.setDoOutput(true);
    			// Récupération du flux de sortie
    		    ObjectOutputStream fluxsortie = new ObjectOutputStream(connexion.getOutputStream());
    			// Envoi du nom à rechercher et le score du joueur
    			fluxsortie.writeObject(j);
     
    		}
    		catch (Exception sql)
    		{
    			System.out.println("erreur "+sql);
    		}
     
    	}
    Par contre je ne sais pas comment faire pour rajouter une en tête au flux d'octet pour pouvoir vérifier,pourriez-vous m'expliquer s'il vous plaît .

  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 kevin254kl Voir le message
    j'ai fais ce que vous m'avais dit esque c'est correct? :
    Presque, parce qu'il vaut mieux séparer la fermeture de chaque flux : là tu fermes tous les flux dans le même bloc finally, donc si la fermeture du premier échoue, le second ne sera de toute façon pas fermé. En plus, si la création du second flux échoue, dans ton cas de code, tu ne fermeras pas le premier.

    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
     
    try {
     
       InputStream input =
       try {
          OutputStream ouput =
          try {
     
          } finally {
            ouput .close();
          }
      } finally {
         input.close();
      } 
     
    }catch(IOException e) {
       ...
    }
    Bien sûr, avec un try-with-resource, c'est moins verbeux et plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     try {
       try (InputStream input = ...) {
          try (OutputStream output = ...) {
     
         }
       } 
    } catch(IOException e) {
    ...
    }

    Par contre je ne sais pas comment faire pour rajouter une en tête au flux d'octet pour pouvoir vérifier,pourriez-vous m'expliquer s'il vous plaît .
    Pour envoyer des paramètres :

    URLConnection.setRequestProperty( nom, valeur ).

    Pour récupérer des paramètres dans un résultat :

    URLConnection.getHeaderField( nom)
    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.

  7. #7
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 583
    Par défaut
    C'est bon j'ai trouvé ,au lieux de définir en joueur mon objet je les mis en Object et après je regarde si mon objet est-une instance de la classe joueur et je fais les traitements nécessaire merci encore voici le code pour ce à qui sa pourrait servir.

    Code JAVA : 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
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    	try {
    			// Récupération du flux d'entrée envoyé par l'applet
    			ObjectInputStream entree=new ObjectInputStream(request.getInputStream());
    			// Préparation du flux de sortie
    			ObjectOutputStream sortie=new ObjectOutputStream(response.getOutputStream());
    			try{
    				Object obj=(Object)entree.readObject();
    				if(obj instanceof Joueur){
    			    this.nom = Joueur.getNom();
    			    this.Score = Joueur.getScore();
    			    this.niveau = Joueur.getNiveau();
    			    Enregistrement_Score();
    				}
    				// Execution de la requête
    				sresultat=ExecuterRequete();
    			    sresultat.first();
    				// Envoi du résultat au client
    				sortie.writeObject(sresultat);
    				sresultat.first();
    		    } finally {
     
    				sortie.flush();
    				sortie.close();
    				entree.close();
    		    }
    	    } catch (Exception ex) {
    	    	System.out.println("Erreur d'exécution de la requête SQL*: "+ex);
     	    }  
    }
    Merci encore joel.drigo pour vos réponses.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/04/2013, 12h10
  2. Sérialisation et erreur "java.io.EOFException"
    Par Drey242 dans le forum Général Java
    Réponses: 3
    Dernier message: 03/06/2011, 16h32
  3. Erreur sur certains ordis lors de l'execution
    Par Nix6800 dans le forum VB.NET
    Réponses: 7
    Dernier message: 06/07/2009, 22h55
  4. Réponses: 2
    Dernier message: 07/10/2008, 16h19
  5. Réponses: 0
    Dernier message: 26/12/2007, 17h28

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