• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> 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?
 

Hausmeister76

Adams Parmäne
Registriert
17.08.04
Beiträge
1.300
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...
 

Trapper

Meraner
Registriert
12.05.05
Beiträge
231
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

Wikinator

Adams Parmäne
Registriert
21.08.04
Beiträge
1.297
hm, ich dachte Pointer gibt es nur in C und C++, aber nicht in Java o_O

Aber gut, wenn ich den BufferedReader vor jedem Aufruf neu erstelle geht es. Danke!
 

commander

Baldwins roter Pepping
Unvergessen
Registriert
25.02.04
Beiträge
3.206
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
 

commander

Baldwins roter Pepping
Unvergessen
Registriert
25.02.04
Beiträge
3.206
Ausserdem kennt der BufferedReader die Methode reset() - die die Lesemarke auf Position 0 setzt.

Gruß,

.commander
 

Trapper

Meraner
Registriert
12.05.05
Beiträge
231
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.
 

commander

Baldwins roter Pepping
Unvergessen
Registriert
25.02.04
Beiträge
3.206
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