Lesen aus Datei (java.util.NoSuchElementException)

deen

Mitglied
Hallo liebe Community,
bei dem Lesen einer Datei bekomme ich immer die oben angegebene Fehlermeldung.
Ich google schon seit Stunden aber komme zu keinem Lösungsweg :noe:
Vorschläge? :bahnhof:

Tester
Java:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.*;

import javax.crypto.*;
import javax.crypto.spec.*;
public class test {
  public static void main(String[] args){
	  
	  DataHandler.load();
	  System.out.println(Benutzer.user[0]+Benutzer.user[1]+Benutzer.user[2]);
  }
  
  


}

Benutzer Klasse
Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.sql.Timestamp;
import java.text.*;


public class Benutzer {
	static int[]password = new int[100];
    
	static int[] worktime=new int[100];
	static int[] sells=new int[100];
	static String[] user = new String[100];
	static double[] earned=new double[100];	
 }

DataHandler
Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.Vector;


public class DataHandler {

public static void load(){

	try {
		Scanner s = new Scanner(new File("userdata.txt"));
		for(int i = 0; s.hasNext(); i++){
			  Benutzer.user[i]=s.next();
			  Benutzer.password[i]=s.nextInt();
			  Benutzer.sells[i]=s.nextInt();
			  Benutzer.earned[i]=s.nextInt();
			  Benutzer.worktime[i]=s.nextInt();
		 }
		 
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	}

 }


public static void save(){
          try {
              PrintWriter writer = new PrintWriter(new File("userdata.txt"));
              for(int i =0; Benutzer.user[i]!= null; i++){
            		  writer.println(Benutzer.user[i]);
            		  writer.println(Benutzer.password[i]);
            		  writer.println(Benutzer.sells[i]);
            		  writer.println(Benutzer.earned[i]);
            		  writer.println(Benutzer.worktime[i]); 
          }
          writer.close();  
          } catch (FileNotFoundException e) {     
              e.printStackTrace();
          }
      } 
}
 
bei dem Lesen einer Datei bekomme ich immer die oben angegebene Fehlermeldung.

Bei einem Fehler steht auch immer ein StackTrace dabei, über diesen StackTrace lässt sich die Zeile herausfinden, welche den Fehler verursacht.
Es wäre praktisch wenn du diese Information auch posten würdest.

Ich google schon seit Stunden aber komme zu keinem Lösungsweg :noe:

Und nach was hast du gesucht?
Was hast du gefunden und probiert?
 
Zuletzt bearbeitet:
Die Gesamte Fehlermeldung ist:

Java:
Exception in thread "main" java.util.NoSuchElementException
	at java.util.Scanner.throwFor(Unknown Source)
	at java.util.Scanner.next(Unknown Source)
	at DataHandler.load(DataHandler.java:19)
	at test.main(test.java:12)
 
Java:
Exception in thread "main" java.util.NoSuchElementException
	at java.util.Scanner.throwFor(Unknown Source)
	at java.util.Scanner.next(Unknown Source)
	at DataHandler.load(DataHandler.java:19)
	at test.main(test.java:12)

Sprich ein Objekt des Typs "Scanner" wirft beim Aufruf der Methode "next()" die Exception "NoSuchElementException"
-> Dieser Link sollte dir die Lösung zeigen 🙂

PS: Die Worte die ich oben zwischen "" geschrieben habe, habe ich direkt für meine Suche bei Google genutzt (inkl "Java" 😉).
 
Bist du dir sicher dass in deiner Eingabe Datei, alle Werte in der richtigen Reihenfolge und auch die Zuordnung String, int etc stimmt.

Poste sie doch mal. Hört sich so an als wollte er was einlesen was nicht geht.

Gruß Helmut
 
Oh habe ich ganz vergessen, entschuldigung!

Hier:

Dennis
1337
0
1
0
asdfsad
6971
0
1
0
safsadfsd
7056
0
1
0
test
3975
0
1
0
tests
6892
0
1
0
 
Ich hab sie gelesen aber verstehe nicht wie die Fehlermeldung zustande kommt, da ich ja vor dem Ablauf der Schleife prüfe, ob noch Daten vorhanden sind.
 
[...]ich ja vor dem Ablauf der Schleife prüfe, ob noch Daten vorhanden sind.

Eigentlich sollte es dir langsam dämmern.

Zitat aus der Dokumentation: "A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace. The resulting tokens may then be converted into values of different types using the various next methods."

Zitat für "hasNext(): "Returns true if this scanner has another token in its Input"

Zitat für "next()": "Finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern."

Du verstehst das Wort "another" in dem Kontext, ja? Und dann schau dir an was du in der Schleife machst.
 
Zuletzt bearbeitet:
Ich hab sie gelesen aber verstehe nicht wie die Fehlermeldung zustande kommt, da ich ja vor dem Ablauf der Schleife prüfe, ob noch Daten vorhanden sind.
... aber nicht inerhalb der Schleife.
Lass dir mal jedes Token einzeln ausgeben. So z. B. :
Java:
for(int i = 0; s.hasNext(); i++){
    String user = s.next();
    System.out.println("User " + i + " : " + user);
    Benutzer.user[i]=user;
    int passwort = s.nextInt();
    System.out.println("Passwort  " + i + " : " + passwort);
    Benutzer.password[i]=passwort;
	//...usw.
}
Vielleicht kommt dann die Erleuchtung.
Für die Zukunft:
1. Stack traces anschauen. Wenn du dir nicht sicher bist, wie man sie liest, dann übe es! Es ist allemal schneller, einen stack trace zu lesen als "stundenlang zu googlen" (was sowieso nach Phrase klingt wenn man nicht imstande ist zu sagen wonach).
2. Stack traces posten.
3. Wenn es bei der Programmausführung zu einem Fehler kommt: finde heraus, unter welchen Bedingungen der entsprechende Programmteil ausgeführt wurde. Wenn die Fehlermeldung sinngemäß lautet "ich kann mit der Variable nix anfangen", dann laß dir die Variable ausgeben. Auch das ist schneller als stundenlang zu googlen oder im Forum auf eine Antwort zu warten.
 
Zuletzt bearbeitet:
Sorry aber langsam weiß ich garnicht mehr weiter
Ich prüfe jetzt innerhalb der Schleife ob noch Daten da sind. IMMERNOCH FALSCH?

Java:
 ry {
		Scanner s = new Scanner(new File("userdata.txt"));
		for(int i = 0;i<Benutzer.user.length; i++){
			if(s.hasNext()){
				Benutzer.user[i]=s.next();
				  Benutzer.password[i]=s.nextInt();
				  Benutzer.sells[i]=s.nextInt();
				  Benutzer.earned[i]=s.nextInt();
				  Benutzer.worktime[i]=s.nextInt();	
			}else{break;}
			  
		 }
		 
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	}
 
Was ist an meinem Post und dem Codeschnipsel so schwer zu verstehen?
Lasse dir jedes einzelne Token ausgeben. Dann siehst du genau, bei welchem "Datensatz" die Exception auftritt, und wahrscheinlich auch wieso.
 
Sorry aber langsam weiß ich garnicht mehr weiter
Ich prüfe jetzt innerhalb der Schleife ob noch Daten da sind. IMMERNOCH FALSCH?

Die Dokumentation sagt hasNext(): "Returns true if this scanner has another token in its Input", another heisst hier "ein weiteres [Token]" wobei die Betonung auf ein liegt. Also ein wie eins wie 1. Was machst du in der Schleife?
 
Also bei mir funktioniert das ursprüngliche Programm mit den oben angegebenen Daten.
Ohne irgend eine Fehlermeldung.

Klar ist's nicht sehr schön, nur auf 1 "hasNext" zu prüfen, ob noch "ein weiterer Datensatz" da ist, und dann 5* zu lesen, aber es funktioniert durchaus.
Kompilier' das ursprüngliche Programm nochmal komplett neu, prüf' nochmal of userdata.txt immer 1 Name + 4 Ints hat, aber eigentlich muss das tun.
Laut StackTrace stammt die NoSuchElement-Fehlermeldung von .hasNext() - was eigentlich nicht sein darf.
 
Zuletzt bearbeitet:
[...]
Klar ist's nicht sehr schön, nur auf 1 "hasNext" zu prüfen, ob noch "ein weiterer Datensatz" da ist, und dann 5* zu lesen, aber es funktioniert durchaus.[...]

Du möchtest also schlechten Code propagieren? Lass die Datei nur 1-4 Zeilen mehr drin haben und alles fliegt dir um die Ohren. Wer weiß wie der OT den Text noch editiert hat.
 
Ich möchte v.a. die Frage des TO beantworten.
Und inwiefern hast du das getan?
Deine Antwort lautet "Es gibt keinen Fehler". So what?
Ich habe gerade keine Möglichkeit, irgendwas zu testen, aber wenn sich die Datei des TO´s mit dem geposteten Programm des TO´s prozessieren läßt, ist irgendwo ein Riesenwurm drin:
TO hat die falsche Eingabedatei gepostet.
TO hast das falsche Programm gepostet.
...
Und um das rauszufinden, muss der TO auf jeden Fall eine andere Debugging-Strategie haben (oder überhaupt erst mal eine). Darauf wollte ich zumindest mit meinen Posts hinaus.
 
Zuletzt bearbeitet:
Also: Der vom TO gepostete Code funktioniert mit der von ihm geposteten Eingabedatei fehlerfrei.
Schlussfolgerung: Der TO hat entweder einen anderen Code oder eine andere Eingabedatei.
 

Neue Themen


Zurück
Oben