2015-12-30 1 views
0

Je dois faire un rapport en utilisant trois fichiers texte. J'ai donc pensé à stocker des données de fichier dans des tableaux. C'est le fichier texte que j'utilise.Obtenir NoSuchElementException

UnitID UName RNo  RName  Lect RCapacity StuEnrolled 
    ECSC410; SDP01; 21; BreakRoom; Dr.Fo; 6;    4; 
    ECSI707; SDP02; 23; BreakRoom; Dr.Fu; 8;    3; 

Voici mon code. Je reçois le NoSuchElementException. Je ne peux pas comprendre pourquoi cela arrive. Aidez-moi s'il vous plaît à le réparer.

public static ArrayList<String> getRecords() { 
    ArrayList<String> records = new ArrayList<>(); 

    BufferedReader br; 
    try { 
     br = new BufferedReader(new FileReader("G:\\lecturer.txt")); 
     String line = br.readLine(); 

     while (line != null){ 
      line = br.readLine(); 
      records.add(line); 

     } 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(Lecture.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(Lecture.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return records; 

} 

public static ArrayList<Lecture> getLectureDetails(){ 
    ArrayList<Lecture> lectureDetails = new ArrayList<>(); 



    for (String record : getRecords()){ 
     StringTokenizer token = new StringTokenizer(record, ";"); 
     Lecture lecture = new Lecture(); 

     while(token.hasMoreTokens()){ 
      lecture.setUnitID(token.nextToken().trim()); 
      lecture.setUnitName(token.nextToken().trim()); 
      lecture.setRoomNo(token.nextToken().trim()); 
      lecture.setRoomName(token.nextToken().trim()); 
      lecture.setLecturerName(token.nextToken().trim()); 
      lecture.setRoomCapacity(Integer.parseInt(token.nextToken().trim())); 
      lecture.setNoOfStudentsEnrolled(Integer.parseInt(token.nextToken().trim())); 

      lectureDetails.add(lecture); 
     } 
    } 
    return lectureDetails; 

} 

Merci!

+0

Certaines lignes de votre fichier texte n'ont pas le même nombre de colonnes! –

+0

la première ligne n'a pas toutes les colonnes – msangel

+0

Avez-vous une ligne d'espace seulement dans votre fichier texte? Probablement, la dernière ligne? – dejvuth

Répondre

0

Votre problème réside dans votre boucle while pour le lecteur tamponné. Vous vérifiez que la valeur précédente n'est pas nulle, plutôt que de vérifier la suivante! Si la ligne n'est pas nulle, elle satisfait votre condition, mais vous obtenez alors la ligne suivante et l'utilisez. Réarranger votre logique:

 br = new BufferedReader(new FileReader("G:\\lecturer.txt")); 
     String line = null; 

     while ((line=br.readLine()) != null){ 
      records.add(line); 
     } 

Mise à jour: Si vous faites cela pour sauter l'en-tête comme commentateur ci-dessous mentionné à juste titre, alors vous pouvez toujours laisser dans votre readLine initiale:

 br = new BufferedReader(new FileReader("G:\\lecturer.txt")); 
     String line = br.readLine(); 

     while ((line=br.readLine()) != null){ 
      records.add(line); 
     } 

Comme une note de côté:

StringTokenizer est une classe héritage, et n'est pas recommandé pour une utilisation. Au lieu de cela, vous devez utiliser la méthode du partage sur les chaînes:

for (String record : records) { 

     String[] tokens = record.split(";"); 

     lecture.setUnitID(tokens[0].trim()); 
     lecture.setUnitName(tokens[1].trim()); 
     ... 
    } 
+0

Je pense qu'il fait cela pour passer l'en-tête –

+0

@name_no Il peut le faire, mais cela signifie qu'il lit dans la ligne sous le contenu qui n'est pas une ligne, et retourne donc null. – MasNotsram

+0

@name_no Merci d'avoir signalé cela, j'ai mis à jour la question pour vous aider! – MasNotsram

0

C'est parce que vous avez à la fois une erreur dans la rupture logique et la ligne intégrée dans chaque ligne.

D'abord, vous tokenize première ligne de vos données avec StringTokenizer, que vous le vérifier ont des jetons avec hasMoreTokens(), puis vous tirez tous les jetons de votre objet dans Lecture. Vous pensez alors que vous obtenez la ligne suivante, mais non.

Ensuite, la boucle while vérifie à nouveau votre première ligne de données avec hasMoreTokens et elle a toujours un dernier jeton, le symbole de saut de ligne. Ainsi, la boucle passe à la deuxième exécution, mais cette fois, les données n'ont qu'un seul jeton et vous obtenez l'erreur.