2013-02-11 2 views
2

Je fais une classe pour lire un objet fichier, c'est enregistré précédemment au fichier (format .txt), mais je reçois l'erreur suivante lorsque vous essayez de charger le fichier:question Scanner: NoSuchElementException

java .util.NoSuchElementException

La méthode est faite de telle manière que l'utilisateur puisse entrer le nom du fichier. Même si on a essayé de déboguer abit et aussi juste se référer au fichier lui-même avec le nom déjà donné (ne pas prendre d'entrée). Voici comment la méthode ressemble:

public void load(String filename) throws FileNotFoundException 
{ 
    final String FIELD_STOP = ":"; 
    String loadFile; 
    loadFile = filename +".txt"; 

    FileReader ansfil = new FileReader(loadFile); 
    Scanner fileIn = new Scanner(ansfil); 
    fileIn.useLocale(new Locale("en")); 

    System.out.println(loadFile); 
    fileIn.useDelimiter(FIELD_STOP); 
    int size; 

    try 
    { 
     while(fileIn.hasNext()) 
     { 
      size = fileIn.nextInt(); 
      archive = new CDarkivImplemented(size); 
      CD readIn = new CDImplemented(); 

      for(int i = 0; i < size ; i++) 
      { 
       readIn = new CDImplemented(); 
       readIn.title = fileIn.next(); 
       readIn.artist = fileIn.next(); 
       readIn.genre = CD.interpretGenre(fileIn.next()); 
       readIn.publisher = fileIn.next(); 
       readIn.year = fileIn.nextInt(); 
       readIn.ID = fileIn.nextInt(); 
       archive.addCD(readIn); 
      } 

     } 

    } 

    catch(Exception e) 
    { 
     System.out.println("Wrong! : " + e); 
     System.exit(1); 
    } 
    fileIn.close(); 
} 
+0

quelle ligne donne l'erreur? –

+0

Etes-vous sûr que vous avez des entiers séparés par deux points dans votre fichier? Il pourrait y avoir une autre chaîne au lieu d'un entier. Vérifiez le contenu de votre fichier. –

+0

Le fichier ne contient que ceci: 50: test: test: pop: test: 2012: 3301: La première valeur est la taille totale remise pour l'archive. Ensuite, la première valeur est égale à la chaîne, la seconde est l'artiste, la troisième est le genre, la quatrième est l'éditeur, puis c'est l'année et une fonction Id générée à partir de la création de l'objet. C'était juste un test rapide pour les méthodes de chargement et d'enregistrement. –

Répondre

0

Qu'est-ce que la boucle while pour? Comme je l'infère à partir de votre commentaire sur le format de fichier, vous n'avez probablement pas besoin de cela, et il pourrait causer l'erreur due à la boucle une fois de plus après la lecture du dernier élément.

+0

Cela l'a corrigé :) –

2

Je suspect c'est le problème:

for(int i = 0; i <= size ; i++) 

Cette boucle exécutera size + 1 fois, ce qui est probablement pas ce que vous vouliez dire. Essayez:

for (int i = 0; i < size; i++) 

et voir si cela aide ...

(En aparté, je déclare la variable readIndans la boucle - il n'y a pas besoin d'avoir à l'extérieur que je avais. également utiliser un bloc finally pour fermer le fichier.)

+0

J'ai peur que ça n'ait pas marché. J'ai aussi pensé à cela plus tôt, mais cela me donne toujours la même exception. –

+0

@ Ole-MortenHeggertveit: Votre fichier ne contient tout simplement pas autant de données qu'il le prétend. Nous ne pouvons pas faire grand-chose pour vous aider - vous devez déboguer et vérifier. –

0
public void load(String filename) throws FileNotFoundException { 
    final String FIELD_STOP = ":"; 
    final String loadFile = filename +".txt"; 
    try(FileReader ansfil = new FileReader(loadFile)) { 
     Scanner fileIn = new Scanner(ansfil); 
     fileIn.useLocale(new Locale("en")); 
     System.out.println(loadFile); 
     fileIn.useDelimiter(FIELD_STOP); 
     int size; 
     while(fileIn.hasNext()) { 
     size = fileIn.nextInt(); 
     archive = new CDarkivImplemented(size); 
     for(int i = 0; fileIn.hasNext() && i < size; i++) { 
      String title = fileIn.next(); 
      if(! fileIn.hasNext()) break; 
      String artist = fileIn.next(); 
      if(! fileIn.hasNext()) break; 
      String genre = fileIn.next(); 
      if(! fileIn.hasNext()) break; 
      String publisher = fileIn.next(); 
      if(! fileIn.hasNext()) break; 
      int year = fileIn.nextInt(); 
      if(! fileIn.hasNext()) break; 
      int ID = fileIn.nextInt(); 
      archive.addCD(
       new CDImplemented(
        title, artist, genre, publisher, year, ID)); 
     } 
     } 
    } 
    catch(Exception e) 
    { 
     System.out.println("Wrong! : " + e); 
     System.exit(1); 
    } 
} 
Questions connexes