Frage von Lizett, 53

Hilfe bei java.lang.NullPointerException?

Wir haben bei von der Uni eine Aufgabe bekommen, bei der schon ein teil vergegeben war. jedoch kommt bei mir in diesem teil ein Fehler den ich nicht ganz nachvollziehen kann.

Exception in thread "main" java.lang.NullPointerException

Wieso kommt sowas beim einlesen?

import java.io.*;

public class WoerterRaten {

public static void main(String[] args) throws IOException {
    Wort[] woerter = einlesen("beispiel.txt");
 }
    
public static Wort[] einlesen(String file) throws IOException {
    BufferedReader in = new BufferedReader(new FileReader(file));
    int anzahl = Integer.parseInt(in.readLine());
    Wort[] woerter = new Wort[anzahl];
    for(int i=0; i<anzahl; i++) {
        woerter[i] = new Wort(in.readLine());
    }
    return woerter;
}

}

Antwort
von ImTommey, 53

Könnte es sein, dass die Variable "file" ("beispiel.txt") nicht den korrekten Pfad enthält zur Datei enthält? Eine NullPointerException tritt dann auf, wenn etwas angegebenes nicht existiert. "beispielt.txt" scheint nicht zu existieren falls ich mich nicht irre.

Kommentar von Lizett ,

doch beispiel txt existiert und ist im richtigen ordner

btw der inhalt der datei:

6JavaKlasseObjektMethodeAttributVererbung

momentmal was mir grade auffällt kann es sein das der die wörter ja garnicht unterscheiden kann und in 0 alles schreibt und in 1 bis 5 nichts?


Kommentar von ImTommey ,

Steht in der Konsole keine Zeilennummer des Fehlers?

Kommentar von Lizett ,

momentmal was mir grade auffällt kann es sein das der die wörter ja garnicht unterscheiden kann und in 0 alles schreibt und in 1 bis 5 nichts?

Kommentar von ImTommey ,

Mit BufferedReader kenne ich mich nicht sonderlich gut aus, aber inkrementiert die Funtion in.readLine() nicht die Zeilennummer, aus welcher gelesen wird? Falls das so ist - und du zwischen den Wörtern keinen Zeilenumbruch gemacht hast - hat die Zeile 2 keinen Wert, somit null. Wenn du nun versuchst einen Wert der Klasse Wort() zuzuweisen, gibt es keinen Wert. Somit eine NullPointerExeption.

Kommentar von ImTommey ,

Was auch nützlich wäre ist keinen relativen Pfad anzugeben, sondern den kompletten einlesen("C:\...\...\...\beispiel.txt"); Ersetze die ... mit dem Pfad.

Kommentar von Lizett ,

Der Fehler kommt in dieser Zeile:

woerter[i] = new Wort(in.readLine());

und an dem Speicherpfad liegt es nicht. Ich habe kurz die Datei umbenannt und dann kam der Fehler:

Exception in thread "main" java.io.FileNotFoundException: beispiel.txt (Das System kann die angegebene Datei nicht finden)

Kommentar von ImTommey ,

Versuche den Dateipfad zu finden. Falls du in eclipse die Datei hast, musst du mit einer anderen Weise auf die Datei zugreifen, weil die Datei nach der Kompilierung von eclipse doch virtuell ist oder nicht?

Kommentar von Lizett ,

habe es eben auch mit der Linux Konsole ausprobiert, aber da kommt das selbe. ich glaube nicht das es an dem pfad liegt da in den letzten übungen ähnliches vorkam und es nie einen Fehler gab?

Kommentar von TUrabbIT ,

Der Pfad ist kein Problem, dann gäbe es eine andere Exception, nämlich FileNotFoundException oder I/O-Exception

Kommentar von Lizett ,

es geht jetzt ... ich habe bei dem objekt wort etwas noch nicht initialisiert und deshalb konnte er es nicht erstellen -.- hätte man ja auch in den fehler packen können aber gut trotzdem danke ;)

Antwort
von TUrabbIT, 25

Wenn der Text der Datei wie du sagst ist:

 6JavaKlasseObjektMethodeAttributVererbung

Ich vermute der Fehler liegt darin, das du 

int anzahl = Integer.parseInt(in.readLine());
versuchst.  in.readLine() liest dabei die ganze Zeile, nicht nur das erste Zeichen. Daran dürfte es liegen, das Integer.parseInt() überhaupt funktioniert dann wundert mich allerdings. Naja schau dir am besten noch mal die Dokumentation des BufferedReader an. Der Fehler ist zumindest dann, das das Array woerter nicht korrekt initialisiert wurde.
Antwort
von phigeek, 10

Eine Nullpointer Exception tritt fast immer auf einer Zeile auf, wo der Punkt Operator (.) verwendet wird.

Z. B.

Object o;

o = null;

o.tuEtwas; // <-- hier, ist o Null

In der Regel ist es die Referenz links vom Punkt, die eben nicht auf ein Objekt, sondern auf "null" zeigt.

In Deinem Fall kann es aber auch daher kommen, dass in.readLine() eben null zurück gibt. Z. B. bei einer leeren Datei. Dann darf "Integer.parseInt(null)" auch eine Nullpointer Exeption liefern.

Schau mal was "in.readLine()" zurück gibt. Z. B

String s = in.readLine();

System.out.println(s);

// und erst dann

Integer.parseInt(s);

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten