Warum werden meine System.out.println's übersprungen?

BigMemo007

Aktives Mitglied
Hallo Leute,

als blutiger Anfänger kann ich folgendes nicht nachvollziehen:

Code:
public void actionPerformed (ActionEvent e) {
            File datei = new File("C:/Users/BigMemo/Documents/test.txt");
            
            try {
                BufferedReader leser = new BufferedReader(new FileReader(datei));
                System.out.println(leser.readLine());  //wird übersprungen, also nicht angezeigt
                System.out.println(leser.readLine());  //wird übersprungen, also nicht angezeigt
                System.out.println(leser.readLine());  //wird übersprungen, also nicht angezeigt
                
                String zeile;
                while ((zeile = leser.readLine()) != null) {
                System.out.println(zeile);
                    
                }
                leser.close();
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            
        }   
    }

Also, die vielen - testhalber eingefügten - System.out.println(leser.readLine()); s werden nicht angezeigt. Die Konsolenausgabe beginnt direkt bei der while-Schleife. Ich hätte ein reihenweises Abarbeiten erwartet.

Ausgabe ist:
1. zeile
2. zeile
3. zeile
4. zeile
5. zeile

statt meiner erwarteten Ausgabe:
1. zeile
1. zeile
1. zeile
1. zeile
2. zeile
3. zeile
4. zeile
5. zeile


Weiteres Problem:
Bei while ((zeile = leser.readLine()) != null) {..} erkennt er, dass leser.readLine() nicht null ist, also geht er in die Schleife rein. Aber wenn ich
while (leser.readLine() ! null) {...} mache, geht die JVM nicht in die Schleife rein. Da glaubt er, das der Rückgabewert null ist.
Was ist denn hier der unterschied?

Vielen Dank schonmal
 

BigMemo007

Aktives Mitglied
Aha.. Erkennt die JVM welche Zeilen sie schon ausgegeben hat und welche als nächste dran sind oder ist eine Art Zeilenzähler in der readLine() Methode eingebaut?

Hmm.. Wenn es in der while-Schleife funktioniert, dass readLine() immer in die nächste Zeile springt, dann muss das ja auch mit mehreren Sysouts hintereinander klappen. Ok. Das hab ich jetzt.

Aber, ist das nun die readLine() oder die JVM, die die Intelligenz dafür mitbringt?

Und warum muss ich als Prüfargument der while die readLine() in eine Variable packen und kann nicht direkt mit != null vergleichen?
while ((zeile = datei.readLine()) != null){} //klappt
while (datei.readLine() != null){} //klappt nicht, es gibt null zurück, so dass nicht in die Schleife gegangen wird.

Ja, vielleicht stelle ich echt dumme Fragen. Vielleicht auch zum Haareraufen. Ich bin bestimmt nicht der tallentierteste zum Programmieren. Aber ich hab Ehrgeiz und will es lernen!
 
K

kneitzel

Gast
Die Logik steckt im BufferedReader. Das sind ja auch nur Klassen, die irgendwie implementiert wurden. Den Code vom BufferedReader kann man z,B. unter http://developer.classpath.org/doc/java/io/BufferedReader-source.html finden. (Als Anfänger nicht wirklich lesbar - nur damit Du es prinzipiell gesehen hast.)

Und da erkennt man dann: Er liest Daten über einen Puffer. Und er sucht dann immer nach einem NewLine Zeichen ('\n').

Und der Code funktioniert auch:
while (datei.readLine() != null){}
Nur eben hast Du dann die Zeile nirgends gespeichert. Er liest also die Zeile aus der Datei und prüft, ob es null ist. Aber er speichert es in keiner Variablen, daher kannst Du da nicht drauf zu greifen.
Aber wenn Du z.B. sowas machst:
while (datei.readLine() != null){ counter++; }
Das wäre dann ein Beispiel: Du willst nur die Zeilen zählen. Was drin steht ist Dir egal. Funktioniert.

Und die Fragen sind ganz in Ordnung. Behalte die Neugierde und frag, was Dich so interessiert.
 

BigMemo007

Aktives Mitglied
Die Logik steckt im BufferedReader. Das sind ja auch nur Klassen, die irgendwie implementiert wurden. Den Code vom BufferedReader kann man z,B. unter http://developer.classpath.org/doc/java/io/BufferedReader-source.html finden. (Als Anfänger nicht wirklich lesbar - nur damit Du es prinzipiell gesehen hast.)

Und da erkennt man dann: Er liest Daten über einen Puffer. Und er sucht dann immer nach einem NewLine Zeichen ('\n').

Und der Code funktioniert auch:
while (datei.readLine() != null){}
Nur eben hast Du dann die Zeile nirgends gespeichert. Er liest also die Zeile aus der Datei und prüft, ob es null ist. Aber er speichert es in keiner Variablen, daher kannst Du da nicht drauf zu greifen.
Aber wenn Du z.B. sowas machst:
while (datei.readLine() != null){ counter++; }
Das wäre dann ein Beispiel: Du willst nur die Zeilen zählen. Was drin steht ist Dir egal. Funktioniert.

Und die Fragen sind ganz in Ordnung. Behalte die Neugierde und frag, was Dich so interessiert.

Ok. Die readLine()-Methode vom BufferedReader merkt sich die Zeilen, die er schon renturniert hat und gibt die noch nicht renturnierte nächste aus. Das hab ich verstanden Danke.

Eine Kleinigkeit noch, dann hab ich es.

while (datei.readLine() != null){
System.out.println(datei.readLine());
}

Dieser Code müsste dann doch mir Zeile 2, 4, usw ausgeben, bis != null false ist. Die 1,3, usw wird dann in der while-Bedingung "aufgebraucht" Es wird aber sofort null augegeben. Warum? Oder spinnt meine JVM?
 

BigMemo007

Aktives Mitglied
Achso, jetzt hab ich es vielleicht. Wenn er mit
while (datei.readLine() != null)
nicht darauf zugreifen kann wie du sagtest, weil eben nicht in eine Variable gespeichert, erkennt er auch nicht, ob in der Datei was drin ist und gibt per Default null zurück. Ist das so richtig?

Leider kann ich vom xioami mi9 aus den code-Feld nicht richtig nutzen, weil mir Zeilen weggelöscht werden(warum auch immer). Entschuldigt bitte, wenn ich Code direkt als Text schreibe gerade.
 

mihe7

Top Contributor
Ist das so richtig?
Fast. Es geht nicht darum, was "er" erkennt (wer auch immer "er" sein soll).

Ich fange mal von vorne an. Als erstes musst Du verstehen, was ein Datenstrom (Stream) ist.

Stell Dir ein Kassenband im Supermarkt vor. Die Teile funktionieren so, dass das Band kontinuierlich läuft. In der Nähe der Kasse ist eine Lichtschranke angebracht, die durch einen auf dem Band liegenden Artikel unterbrochen wird, damit das Band stoppt, wenn der Artikel in Griffweite des Kassierers liegt.

Jetzt nehmen wir an, dass der Kassierer so ungünstig sitzt, dass er immer nur den vordersten Artikel sehen kann. Er weiß also im Voraus nicht, ob auf dem Band noch fünf oder fünfzig weitere Artikel liegen.

Immer, wenn der Kassierer ein Artikel vom Band nimmt, kommt der nächste - bis kein weiterer Artikel mehr auf dem Band verfügbar ist.

Ein Datenstrom funktioniert wie das Kassenband. Man weiß im Voraus nicht, wann das Ende erreicht ist. So lange weitere Elemente im Strom vorhanden sind (Artikel auf dem Band liegen), kann man ein Element aus dem Strom lesen, dabei wird das Element aus dem Strom entfernt (Artikel wurde vom Band genommen). Gibt es keine weiteren Elemente im Strom, wird das entsprechend angezeigt.

Mit einem Reader liest man einen Zeichenstrom. Man kann sich das nächste Zeichen holen, dann ist das Zeichen aus dem Strom entfernt usw. Das Ende bekommt man entsprechend angezeigt (in Java liefert die read-Methode -1, wenn das letzte Zeichen des Stroms bereits gelesen wurde).

Ein BufferedReader ist in der Lage, den Zeichenstrom nicht nur zeichen- sondern auch zeilenweise zu lesen. Dann wird eben nicht ein einzelnes Zeichen, sondern eine ganze Zeile aus dem Zeichenstrom gelesen und entfernt. Wurde das Ende des Stroms erreicht, gibt readLine() null zurück.

In der Schleife
Java:
while (br.readLine() != null) {}
wird readLine() wiederholt aufgerufen. Bei jedem Aufruf wird die nächste Zeile aus dem Zeichenstrom gelesen und entfernt, bis keine weitere Zeile mehr vorhanden ist. Nachdem die letzte Zeile gelesen wurde, liefert readLine() null und die Schleife wird beendet.

Das Problem ist nun einfach, dass Du Dir weder die gelesene Zeile merkst noch in der Schleife irgendetwas sinnvolles machst. Wir könnten ja mal Zeilen zählen:
Java:
int anzahl = 0;
while (br.readLine() != null) {
    anzahl++;
}
System.out.printf("%d Zeilen gelesen\n", anzahl);

Wenn Du in der Schleife Zugriff auf die gelesene Zeile haben willst, musst sich das Programm die gelesene Zeile irgendwo merken. Dazu verwendest Du eine Variable, der Du die gelesene Zeile zuweist:
Java:
String zeile;
while ((zeile = br.readLine()) != null) {
    System.out.println(zeile);
}
oder ausführlicher:
Java:
String zeile = br.readLine();
while (zeile != null) {
    System.out.println(zeile);
    zeile = br.readLine();
}

Entschuldigt bitte, wenn ich Code direkt als Text schreibe gerade.
Das ist in dem Fall kein Problem, weil Du erstens nur eine Zeile geschrieben hast und zweitens keine Zeichen verwendet hast, die der Editor falsch interpretiert. Du kannst aber Code auch ohne Toolbar im Editor setzen, dazu einfach [code=Java]Langer Code inkl. Einrückungen[/code] in den Editor tippen. Für inline-Code verwendest Du einfach [icode]was kurzes[/icode].
 

BigMemo007

Aktives Mitglied
Vielen vielen Dank an euch allen. Jetzt hab ich es gecheckt. Ich hab berufsbedingt nur zwei Tage Zeit in der Woch meinen Hobbys nachzugehen und da mache ich so viel (gerade Java), dass mir der Kopf raucht und ich einfache Sachen nicht mehr sehe. Aber eine Nacht drüber und es geht wieder.

Java:
 while (leser.readLine() != null) {
        System.out.println(leser.readLine());      
}

Jetzt wird mir Zeile 2, 4, null angezeigt, was auch korrekt ist, weil die obere leser.readLine() Zeile 1, 3, 5 verbraucht (ich habe 5 Zeilen in meiner txt-Datei). Gestern hat meine Anzeige nur null ausgegeben, sonst nichts. Ich hab bestimmt einen dummen kleinen Fehler drin gehabt, den ich zum Erbrechen nicht gesehen habe.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
A Hilfe meine Titel werden alle abgelehnt Java Basics - Anfänger-Themen 4
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
I Zapier -> wie werden Objekte gespeichert? Java Basics - Anfänger-Themen 10
L Datum - Monat und Jahr werden falsch angezeigt Java Basics - Anfänger-Themen 4
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
K Warum werden immer noch doppelte Zahlen ausgegeben ? Java Basics - Anfänger-Themen 13
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
I aus 2 random zahlen soll nur die ungerade summe der beiden genommen werden. Java Basics - Anfänger-Themen 13
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
R Audio kann nur zum Teil gestoppt werden Java Basics - Anfänger-Themen 1
berserkerdq2 sqllite in Java, wenn ich mache select count(*) ..., erhalte ich dann nur die gezählte Anzahl oder werden auch die Tabellen ausgegeben? Java Basics - Anfänger-Themen 2
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
docmas 2DArray Werte werden nur untereinander ausgegeben Java Basics - Anfänger-Themen 1
E Umlaute und Sonderzeichen werden nach der Build Project nicht richtig angezeigt Java Basics - Anfänger-Themen 2
M Bei nach oben scrollen soll Seite aktualisiert werden (Userscript mit Javascript) Java Basics - Anfänger-Themen 10
A Wenn eine Zahl durch 7 teilbar ist, soll statt der Zahl ein ‘*‘ angezeigt werden. java? Java Basics - Anfänger-Themen 47
C Ein Algorithmus soll schneller werden Java Basics - Anfänger-Themen 24
Q Prüfen ob Zahl als Summe von Potenzen dargestellt werden kann. Java Basics - Anfänger-Themen 20
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
LiFunk Exception: es dürfen nur Nummern eingelesen werden Java Basics - Anfänger-Themen 6
U Hauptklasse kann nicht gefunden werden Java Basics - Anfänger-Themen 8
OZAN86 For Schleife von 1-50 die Zahlen werden durch ein Komma getrennt Java Basics - Anfänger-Themen 10
M Wie kann ich Werte die in einer While Schleife sind weiter genutzt werden? Java Basics - Anfänger-Themen 7
Hallolu Pong-Spiel: Schläger schneller werden lassen Java Basics - Anfänger-Themen 9
C java.sql Statement kann nicht geschlossen werden Java Basics - Anfänger-Themen 9
LetsSebi Dateien werden nicht in Zip gespeichert Java Basics - Anfänger-Themen 1
D Codeblöcke, die immer wieder im Programmverlauf benötigt werden Java Basics - Anfänger-Themen 5
J Array Elemente werden nicht gefunden! Java Basics - Anfänger-Themen 6
M Warum werden character, die Leerzeichen sind, nicht korrekt verarbeitet? Java Basics - Anfänger-Themen 2
C Array-Werte werden gemischt, ohne Logik Java Basics - Anfänger-Themen 2
P Variablen HttpResponse.getBody() wird automatisch org.json Object und kann nicht zu json.simple Object gecastet werden? Java Basics - Anfänger-Themen 7
F JMenuItem Kann nicht nach einem String benannt werden... Java Basics - Anfänger-Themen 11
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
Zrebna Programm kann aus der Konsole nicht gestartet werden (in der IDE läuft es) Java Basics - Anfänger-Themen 2
D Zahlen werden falsch gekürzt :? Java Basics - Anfänger-Themen 27
T Javafx ListView kann nicht gefüllt werden. Java Basics - Anfänger-Themen 6
H Eclipse kann nicht gestartet werden .... Java Basics - Anfänger-Themen 15
R Warum werden hier nur die grün und orangen Linien ausgegeben und der Rest unten nicht? Java Basics - Anfänger-Themen 5
J Eckige Klammern werden nicht erkannt Java Basics - Anfänger-Themen 1
J Klammern werden fälschlicherweise eingelesen Java Basics - Anfänger-Themen 2
Elyt Bei Monopoly werden Felder übersprungen Java Basics - Anfänger-Themen 2
Kirby.exe Hauptklasse konnte nicht gefunden werden.... Java Basics - Anfänger-Themen 27
B Nach dem kompilieren werden Bilder nicht mehr gefunden Java Basics - Anfänger-Themen 10
L Muss eine HttpURLConnection geschlossen werden? Java Basics - Anfänger-Themen 2
D java main methode kann nicht kompiliert werden (Erstellen eines Objekts) Java Basics - Anfänger-Themen 6
S Vergleichen ob der Integer der benutzt eingeben werden soll überhaupt ein int ist Java Basics - Anfänger-Themen 1
B Warum können super() und this() nicht gemeinsam in einem Konstruktor verwendet werden? Java Basics - Anfänger-Themen 7
V Array, Symbol kann nicht gefunden werden Java Basics - Anfänger-Themen 2
S TableView Items werden nicht angezeigt (+Verständnisfragen) Java Basics - Anfänger-Themen 15
O Apache: Log-Settings werden nicht gezogen Java Basics - Anfänger-Themen 0
H LayoutRes, Nullable und SystemServices werden in LayoutInflater nicht importiert Java Basics - Anfänger-Themen 9
A Wie erkennt die JVM welche class verwendet werden muss? Java Basics - Anfänger-Themen 3
L Input/Output AudioInputStream kann nicht erstellt werden. Java Basics - Anfänger-Themen 3
E Die Hauptklasse konnte nicht gefunden werden. Java Basics - Anfänger-Themen 12
H Hauptklasse ... konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 8
I Projekt als .jar Datei speichern - Bilder werden nicht mehr angezeigt Java Basics - Anfänger-Themen 4
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
A Reader wohin werden Daten gespeichert? Java Basics - Anfänger-Themen 7
S Hauptklasse konnte nicht gefunden werden Java Basics - Anfänger-Themen 0
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
C Matrix-Werte werden nicht wie erwartet ausgegeben Java Basics - Anfänger-Themen 7
A Harshad Zahlen sollen in einem Intervall ausgegeben werden Java Basics - Anfänger-Themen 8
M GUI Startbutton und Titel werden nicht angezeigt Java Basics - Anfänger-Themen 1
F Variablen JTextField-Inhalt kann nicht mit String abgeglichen werden Java Basics - Anfänger-Themen 2
F Interface JButtons werden nicht angezeigt... Java Basics - Anfänger-Themen 5
DaCrazyJavaExpert Bilder werden nicht angezeigt! Java Basics - Anfänger-Themen 6
DaCrazyJavaExpert JLabels werden nicht angezeigt Java Basics - Anfänger-Themen 4
G Verkettete Liste - Neu erzeugte Elemente werden nicht ausgegeben Java Basics - Anfänger-Themen 5
S Fehler: Hauptklasse bin.demo.Start konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 2
M Klassen Fehler: Hauptklasse konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 17
P Interface Variablen-Inhalte werden nicht übergeben Java Basics - Anfänger-Themen 3
S Classpath "Hauptklasse konnte nicht gefunden oder geladen werden" Java Basics - Anfänger-Themen 6
T In Konsole darf nichts falsches eingetippt werden?! Java Basics - Anfänger-Themen 7
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
C AppletViewer-Eigenschaftendatei kann nicht gelesen werden Java Basics - Anfänger-Themen 0
D Erste Schritte JFrame Inhalte werden nicht angezeigt Java Basics - Anfänger-Themen 8
L Bei falscher Eingabe soll NaN zurückgegeben werden, Rückgabetyp jedoch double Java Basics - Anfänger-Themen 3
A Die Werte zur Berechnung müssen als Parameter übergeben werden? Java Basics - Anfänger-Themen 7
H überprüfen ob in Array gleiche int-Zahlen gespeichert werden. Java Basics - Anfänger-Themen 7
P Threads Prozess kann nicht über die GUI gestartet werden Java Basics - Anfänger-Themen 8
D Prozente werden falsch berechnet Java Basics - Anfänger-Themen 8
H javac.exe konnte nicht gefunden werden Java Basics - Anfänger-Themen 2
H Methoden können nicht verwendet werden Java Basics - Anfänger-Themen 10
P Programm kann über CMD nicht ausgeführt werden Java Basics - Anfänger-Themen 2
C Java Hauptklasse konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 14
J Kann der Typ eines Objekts ausgegeben werden? Java Basics - Anfänger-Themen 11
K Hauptklasse konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 3
N String kann nicht in Wochentag konvertiert werden Java Basics - Anfänger-Themen 6
C Klassen Sudoku-Spiel Werte werden nicht gesetzt Java Basics - Anfänger-Themen 4
B PATH kann nicht geändert werden Java Basics - Anfänger-Themen 2
J JDK installieren Hauptklasse .... konnte nicht geladen werden. Java Basics - Anfänger-Themen 4
K Klassen Hilfe - Hauptklasse kann nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 5
D Classpath Bild kann in .jar nicht geladen werden Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben