• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

[Java] explizit eine Zeile auslesen

Wikinator

Adams Parmäne
Registriert
21.08.04
Beiträge
1.297
Hallo,

ich finde hierbei einfach den Fehler nicht:
Ich habe ein File was ich mit dem BufferedReader auslese. Damit ich nicht endlos viele unnötige Variablen erstellen muss, mache ich das mit dieser Methode:
Code:
for (int i = number; i != 0 && line != null; i--) 
[INDENT]line = in.readLine();[/INDENT] 
return line;

das funktioniert auch gut, mit Zeile 1, 2, 3 und 4. Aber wenn ich so aufrufe:
Code:
 stringh = getLine(4, in);
            height = Double.parseDouble( stringh );

            stringw = getLine(5, in);
            width = Double.parseDouble(stringw);

            stringx = getLine(6, in);
            x = Double.parseDouble(stringx);

            stringy = getLine(7, in);
            y = Double.parseDouble(stringy);
das wirft immer eine "Java.lang.NullPointerException", obwohl die Datei aus mehr als 4 Zeile besteht.
Wenn ich eine andere kleine Testklasse dazuschreibe, die einfach nur aus einem Testfile Zeile 12 ausgibt, funktioniert die Methode perfekt. Was mache ich falsch?
 
hi...

deine for-Schleife funktioniert nur bis Zeile 4? schreib doch mal bitte noch eine Ausgabe auf die Konsole in die for-Schleife für das i, number und das line..... und eventuell alles drei nochmal vor die for Schleife. Eventuell liegts an den Variablen...

so long...
 
Du übergibst deiner getLine-Methode ja neben der gewünschten Zeile auch noch den BufferedReader. Wenn du diesen nicht außerhalb immer neu erstellst, wird dein getLine nicht richtig funktionieren, da der BufferedReader intern einen Pointer verwaltet, wo er gerade in der Datei ist.

Schreibst du also im Code:
getLine(2, in);
getLine(3, in);

wird der zweite Aufruf die 5. Zeile der Datei liefern. Der BufferedReader springt ja nicht zurück an den Anfang der Datei. Beim ersten Aufruf funktioniert also getLine. Bei nachfolgenden musst du den BufferedReader neu erzeugen und damit wieder auf den Anfang der Datei verweisen lassen.
 
  • Like
Reaktionen: Wikinator
hm, ich dachte Pointer gibt es nur in C und C++, aber nicht in Java :-/

Aber gut, wenn ich den BufferedReader vor jedem Aufruf neu erstelle geht es. Danke!
 
Einfacher und performanter wäre es, du würdest den Summs auf einen Schwung einlesen und danach auswerten.

Und es ist kein Pointer im C Sinne, sondern einfach nur eine Art Lesemarke ;-)

Gruß,

.commander
 
Ausserdem kennt der BufferedReader die Methode reset() - die die Lesemarke auf Position 0 setzt.

Gruß,

.commander
 
reset() spring an die Stelle, die zuletzt mit mark() markiert wurde. Das muss nicht unbedingt der Dateianfang sein.

Egal, das wichtige ist, dass Wikinator den Fehler in seiner Methode gesehen hat und die Funktionsweise des BufferedReader damit wohl besser versteht. Wie er diese Semantik nun syntaktisch umsetzt ist eher zweitrangig.
 
Trapper schrieb:
reset() spring an die Stelle, die zuletzt mit mark() markiert wurde. Das muss nicht unbedingt der Dateianfang sein.

Stömmt. mark() hab ich noch nie verwendet, ehrlich gesagt. Danke für den Hinweis!

Gruß,

.commander