Guten Abend, wir haben diese Aufgabe gestellt bekommen:
Meine Lösung wäre eigentlich so, jedoch funktioniert das nicht. Es wird der else Befehl ausgelöst und "Die Datei existiert nicht" ausgegeben.
Meine Frage ist: Stimmt denn das Programm soweit? Sollte es eigentlich funktionieren oder findet jemand einen Fehler?
Falls alles sonst stimmt, dann liegt der Fehler darin, wie ich das File eingefügt habe (irgendwie falscher Pfad, oder falsch erstellt?)
Java:
//Zuerst erstellen sie eine Zahlenliste in einer txt-Datei.//Jede Zeile der Datei sollte aus einer ganzen Zahl bestehen.//Dann schreiben sie ein Programm, das den Durchschnitt aller Zahlen ausgibt.package aufgabe7;importjava.io.*;importjava.util.*;publicclassAufgaben{publicstaticvoidmain(String[] args)throwsFileNotFoundException{File datei =newFile("/Users/Matze/Documents/Textdatei.txt ");if(datei.exists()){Scanner eingabe =newScanner(datei);intReihenzahl=0;intZähler =0;doubleSumme=0;doubleErgebnis;while(eingabe.hasNext()){Reihenzahl=Reihenzahl+1;}System.out.println("Reihenzahl"+Reihenzahl);
eingabe =newScanner(datei);while(Zähler <=Reihenzahl){intZahl= eingabe.nextInt();Summe=Zahl+Summe;Zähler =Zähler +1;}Ergebnis=Summe/Reihenzahl;System.out.println(Summe);}else{System.out.println("Die Datei existiert nicht");}}}
Danke, das Leerzeichen hat insofern geholfen, dass jetzt keine Fehlermeldung mehr kommt, ergo der If Befehl ja ausgeführt werden müsste.
Jedoch kommt der Prozess nicht zum Ende. Im Anhang ein Bild. Es runnt und runnt und nichts passiert.
Nutze beim Scanner immer Paare von hasNextXXX() und nextXXX() -- die 1. Methode sagt, ob noch etwas im Strom ist, die 2. Methode gibt dir das Token zurück.
Ich habe eingabe.hasNext( ) verwendet, da der Scanner immer eine Zeile weiter runter rutschen soll, nachdem er einen Wert eingelesen hat. In der Vorlesung hat das auch noch geklappt nach dem Schema.
Er meint damit, dass die Scanner.hasNextXXX() Methode selbst den Strom nicht weiterliest. Scanner.hasNextXXX() gibt nur zurück, ob es ein nächstes einzulesendes Token vom Typ XXX gibt. Wenn du dieses Token aber per Scanner.nextXXX() niemals abholst, bleibt der Scanner immer vor dem ersten Token stehen und du kannst so oft Scanner.hasNextXXX() aufrufen, wie du willst. Es wird immer true zurückgeben, wenn der allererste Aufruf auch true lieferte.
Nochmals: Scanner.hasNextXXX() wandert im Eingabestrom nicht von selbst weiter. Das tuen nur die Scanner.nextXXX() Methoden.
Kleiner Test, um zu sehen, dass Scanner.hasNextXXX() eben NICHT im Strom vorfährt: