# Lesen aus Datei (java.util.NoSuchElementException)



## deen (28. Okt 2014)

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

```
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

```
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

```
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();
          }
      } 
}
```


----------



## Joose (28. Okt 2014)

deen hat gesagt.:


> 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.



deen hat gesagt.:


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



Und nach was hast du gesucht? 
Was hast du gefunden und probiert?


----------



## deen (28. Okt 2014)

Die Gesamte Fehlermeldung ist: 


```
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)
```


----------



## Joose (28. Okt 2014)

deen hat gesagt.:


> ```
> Exception in thread "main" java.util.NoSuchElementException
> at java.util.Scanner.throwFor(Unknown Source)
> at java.util.Scanner.next(Unknown Source)
> ...



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" ).


----------



## deen (28. Okt 2014)

Den habe ich auch schon gefunden aber er hilft mir leider nicht weiter. 
Kannst du das vielleicht weiter erläutern?


----------



## nvidia (28. Okt 2014)

deen hat gesagt.:


> Den habe ich auch schon gefunden aber er hilft mir leider nicht weiter.



Dann vll. wenn du dir ganz genau den Text unter folgenden Links durchliest und deinen Code Schritt für Schritt analysierst.

Scanner (Java Platform SE 8 )
Scanner (Java Platform SE 8 )


----------



## Joose (28. Okt 2014)

deen hat gesagt.:


> Den habe ich auch schon gefunden aber er hilft mir leider nicht weiter.
> Kannst du das vielleicht weiter erläutern?



Da muss ich ehrlich sein: Ich habe in deinem Code etwas übersehen und daher das Falsche vermutet.


----------



## deen (28. Okt 2014)

Aber? :shock:


----------



## Admiral Helmut (28. Okt 2014)

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


----------



## deen (28. Okt 2014)

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


----------



## Admiral Helmut (28. Okt 2014)

HHmm ich würde mal testen ob es geht, wenn du aus deinem Double auch in int machst und alles in der eingabedatei mal in eine zeile mit leerzeichen getrennt.


----------



## nvidia (28. Okt 2014)

Admiral Helmut hat gesagt.:


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



Sein Problem ist das er die API-Dokumentation zu Scanner nicht liest/gelesen oder nicht verstanden hat.


----------



## deen (28. Okt 2014)

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.


----------



## nvidia (28. Okt 2014)

deen hat gesagt.:


> [...]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.


----------



## Harry Kane (28. Okt 2014)

deen hat gesagt.:


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

```
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.


----------



## deen (28. Okt 2014)

Sorry aber langsam weiß ich garnicht mehr weiter 
Ich prüfe jetzt innerhalb der Schleife ob noch Daten da sind. IMMERNOCH FALSCH? 


```
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();
	}
```


----------



## Harry Kane (28. Okt 2014)

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.


----------



## nvidia (28. Okt 2014)

deen hat gesagt.:


> 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?


----------



## arilou (28. Okt 2014)

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.


----------



## nvidia (28. Okt 2014)

arilou hat gesagt.:


> [...]
> 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.


----------



## arilou (28. Okt 2014)

nvidia hat gesagt.:


> Du möchtest also schlechten Code propagieren?


Ich möchte v.a. die Frage des TO beantworten, und nehme mir die Freiheit, sonstige Verbesserungen hintenanzustellen.


----------



## Harry Kane (28. Okt 2014)

arilou hat gesagt.:


> 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.


----------



## Harry Kane (28. Okt 2014)

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.


----------

