Java kann nicht aus .txt-Datei lesen?
Hallo,
ich möchte gern einen Wert aus einer Textdatei lesen. Das klappt allerdings noch nicht. Hier die Methode und der Fehler (die sysouts sind zum Debugging da):
public int getIndex(String path) throws IOException {
File file = new File(path);
System.out.println(file.exists()); //Es kommt true raus.
Scanner sc1 = new Scanner(file, "cp1252");
if (sc1.hasNext()) {
index = sc1.nextInt();
}
sc1.close();
System.out.println(index); // es sagt, die Datei ist leer
return index;
}
In der Textdatei steht eine Zahl: 235.
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Measurement.getCharge()" because the return value of "Database.getMeasurement(int)" is null
Hier die im Fehler genannten Methoden:
public Measurement getMeasurement(int index) {
return measurementDB.get(index + 1);
}
public String getCharge() {
String temp = "";
for (MeasurementEntry m: entries) {
temp += m.getcharge() + "\n";
}
return temp;
public String getcharge() {
return charge;
2 Antworten
Zuerst einmal: Die Fehlermeldungen kommen nicht direkt von der Methode "getIndex". Vielleicht höchstens indirekt, weil getIndex halt einen falschen Wert zurückgibt.
Dann ganz wichtig: Wenn du prüfen willst, ob der Scanner als nächstes einen int-Wert lesen kann, benutze bitte sc1.hasNextInt(). Sonst kann es sein, dass du mit hasNext() zwar gemeldet kriegst, dass etwas in der Datei steht, aber kriegst danach eine InputMismatchException, weil der Scanner das nächste Token nicht in ein int umwandeln kann. Ich würde dir zum debuggen auch empfehlen, ein sysout in den if-Block reinzumachen, damit du siehst, ob er überhaupt ausgeführt wird.
Was mir noch aufgefallen ist: Die Variable index wird nicht in der Methode deklariert. Das heißt, du greifst auf eine Klassenvariable zu. Ich weiß nicht, ob das beabsichtigt ist. Könnte aber später ein Stolperstein beim debuggen werden. Ich gehe immer automatisch davon aus, dass alles, was returnt wird auch nur lokal in der Methode existiert.
Zur Methode nextInt musst du auch wissen, dass der Scanner standardmäßig Whitespace (Leerzeichen, Zeilenumbrüche, Tabs etc.) als Trennzeichen sieht. Wenn in der Datei also z.B. 10.03.2022 steht, wird das nicht als drei Zahlen eingelesen, sondern der Scanner sagt nur, dass er den Wert nicht zu einem int umwandeln kann.
Evtl. ist auch wirklich die Codierung falsch. Ich hab die Option, dass man die Codepage angeben kann, bisher noch nie gebraucht, weil der Scanner alleine das Richtige genommen hat. Wenn die Daten in der Tabelle jetzt aber z.B. utf-16 sind und der Scanner versucht, sie mit cp1252 einzulesen, erkennt er die Zahlen nicht richtig.
Das ist wirklich merkwürdig. Und du bist sicher, dass in der Variable "path" der richtige Pfad übergeben wird (vielleicht ein relativer Pfad, an dem eine Datei mit dem gleichen Namen liegt) und dass in der Datei auch wirklich was drinsteht (nicht irgendwo vergessen, auf "speichern" zu klicken?)
Ich hatte es bisher noch nie, dass der Scanner nichts gelesen hat.
Ja, der Pfad ist einfach der name der Datei Store.txt
Da bin ich mir sicher, dass es klappt, da meine Properties File genau auf dem gleichen liegt. So wirds Aufgerufen: System.out.println(DB.getMeasurement(DB.getIndex("Store.txt")).getCharge());
Habs mal mit einem BufferedReader versucht. Der Code:
public int getIndex(String path) throws IOException {
InputStream file = new FileInputStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(file));
index = Integer.parseInt(reader.readLine());
System.out.println(index);
return index;
}
Der error:
Exception in thread "main" java.lang.NumberFormatException: null
at java.base/java.lang.Integer.parseInt(Integer.java:622)
at java.base/java.lang.Integer.parseInt(Integer.java:778)
LG
Ich würde trotzdem mal probieren, ob es besser klappt, wenn du einen absoluten Pfad angibst (also sowas, wie DB.getIndex("C:\\test\\Store.txt")). Es kann auch sein, dass die Properties Datei einfach eine Kopie von einer anderen Datei ist und es deshalb klappt.
Bitteschön 👍
PS: Du kannst mal schauen, welche Datei geöffnet wird, wenn du nur "Store.txt" als Dateinamen übergibst:
System.out.println(Paths.get("Store.txt").toAbsolutePath());
Da wird warscheinlich sowas in der Art "C:\Users\Ich\eclipse-workspace\Project\Store.txt" rauskommen.
Probiers mal mit
BufferedReader reader = new BufferedReader(new FileReader(file));
String firstLine = reader.readLine();
int i = Integer.parseInt(firstLine);
Kann ja nicht sein, dass er den Inhalt einfach nicht findet. Vielleicht ist das Encoding falsch?
Habs mal mit einem BufferedReader versucht. Geht leider dennoch nicht :( Der Code:
public int getIndex(String path) throws IOException {
InputStream file = new FileInputStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(file));
index = Integer.parseInt(reader.readLine());
System.out.println(index);
return index;
}
Der error:
Exception in thread "main" java.lang.NumberFormatException: null
at java.base/java.lang.Integer.parseInt(Integer.java:622)
at java.base/java.lang.Integer.parseInt(Integer.java:778)
LG
ja die Datei kann entweder nicht gefunden werden oder es ist nichts in der Datei drin bzw keine richtige nummer
Er geht leider nicht in die if rein. Habe diese mal weg gemacht und direkt index=sc1.nextInt(); gemacht, da sowieso immer nur eine Zahl in zukunft in der .txt stehen wird. Nun kommen folgende Fehler:
Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at de.flg.spektrometerinterface.variables.Database.getIndex(Database.java:80)
at de.flg.spektrometerinterface.serververbindung.Main.main(Main.java:27)