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 Discussion :

Exception NoSuchElementException à la lecture d'un fichier


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Par défaut Exception NoSuchElementException à la lecture d'un fichier
    Bonjour,

    j'ai un problème étrange que je n'arrive pas à résoudre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                s = new Scanner(new File(filename), "SJIS");
                String l = s.nextLine();
    lance l'exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    java.util.NoSuchElementException: No line found
            at java.util.Scanner.nextLine(Scanner.java:1516)
            at ... (la ligne avec nextLine dans ma méthode)
    Ce qui est étrange, c'est que le fichier contient bien plusieurs lignes, terminées par des CRLF comme normal.
    D'ailleurs, un nextByte() lance aussi une exception NoSuchElementException, alors que le fichier n'est évidement pas vide...

    Par contre, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                inputStream = new BufferedReader(
                            new InputStreamReader(
                            new FileInputStream(filename),"SJIS"));
                String l1 = inputStream.readLine();
                System.out.println(l1);
                inputStream.close();
    Fonctionne sans soucis, et affiche la première ligne du fichier.

    Qu'est-ce qui peut expliquer la différence de comportement entre les deux méthodes pour ouvrir le fichier? La premiere méthode fonctionne bien pour 500 fichiers similaires, mais pas sur celui là, ce qui me trouble encore plus...

  2. #2
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Par défaut Ca n'a pas l'air simple...
    Bonjour,

    Avant tout, j'aimerais être sûr que votre volonté est bien d'ouvrir un fichier encodé Shift_JIS (apparemment, un encodage utilisé par la langue japonaise) ?
    Ensuite, vous ne modifier pas le délimiteur de votre scaner lors de votre invocation de la méthode nextLine(). Donc dans ce cas, le délimiteur par défaut utilisé par Scanner est le caractère ASCII espace. Je ne sais pas si ce dernier existe dans du texte ainsi encodé, mais votre message d'erreur semble simplement dire qu'il n'en trouve aucune occurrence !
    En effet, la méthode nextLine() est faite pour renvoyer l'ensemble des caractères 'survolés' jusqu'à l'occurrence suivante du délimiteur, donc dans votre cas, l'espace. Le message dit clairement qu'il n'en trouve pas...

    Dans votre troisième extrait de code, vous ne procédez pas du tout de la même façon. Vous lisez directement le fichier vous-même en utilisant un Reader qui vous permet d'invoquer la méthode readLine. Cette dernière renvoie la prochaine ligne de texte qui se termine par un "\n", ça n'a rien à voir avec la méthode nextLine() du Scanner...
    Comme apparemment votre fichier contient bien quel que soit son encodage des retours chariot (ce n'est pas un caractère ASCII, c'est un retour chariot)...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Par défaut
    Bonjour,

    oui, il s'agit bien d'un fichier en langue japonaise.
    Pour moi, la méthode nextLine() du scanner renvoit bien la ligne en cours jusqu'au prochain passage à la ligne (je l'ai testé sur d'autres fichiers sans problème, et c'est ce qui est indiqué dans la javadoc) C'est la méthode next() qui s'intéresse au délimiteur (je m'en servirais un peu plus loin si ce bout de code marchait).
    Ce qui m'étonne, c'est que le scanner ne trouve *rien du tout* (même un nextByte ne fonctionne pas), alors que le BufferedReader n'a pas de soucis... Comment expliquer la différence?

    PS: ça ne devrait pas avoir d'influence, mais SJIS est une extension de ASCII, donc les retours à la ligne/" "/ etc. ont le même code binaire.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pourriez vous attacher un exemple de fichier et un petit Main qui reproduit le problème?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Par défaut
    Bonjour,

    j'ai fini par comprendre ce qui n'allait pas...
    If an invocation of the underlying readable's Readable.read(java.nio.CharBuffer) method throws an IOException then the scanner assumes that the end of the input has been reached. The most recent IOException thrown by the underlying readable can be retrieved via the ioException() method.
    Il y avait une IOException levée, c'est pour ça que le readLine croyait être arrivé à la fin... J'ai juste eu à appeller la méthode ioException pour avoir un message d'erreur plus compréhensible.

    Merci pour l'aide en tout cas.

  6. #6
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Par défaut
    Bravo TellMarch. Et désolé de vous avoir répondu un peu à côté. En fait, je ne connaissais pas encore cette classe utilitaire Scanner, et j'ai lu un peu vite les spécifications. D'ailleurs, je remarque que ce qui vous a donné la réponse est en fait écrit dans cette spécification, donc le pire pour moi, c'est que je l'ai lu, ce qui ne m'a pas empêché de vous dire des bêtises. J'avais cru tout simplement avoir mis le doigt sur le problème
    En tout cas merci pour vos précisions, je ne connaissais rien avant cela sur ce charset.
    Bonne continuation à vous.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

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

Discussions similaires

  1. [Débutant] Exception création / lecture d'un fichier
    Par Popi_ dans le forum C#
    Réponses: 3
    Dernier message: 25/02/2015, 11h43
  2. [Débutant] Exception lors de la lecture d'un fichier xml
    Par Tinku dans le forum C#
    Réponses: 7
    Dernier message: 29/11/2011, 09h20
  3. [JDOM] Exception pendant la lecture d'un fichier XML avec JDOM
    Par 0coco0 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 20/03/2009, 11h21
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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