Hallo!
Ich spiele grad ein wenig mit Java und war jetzt bei Dateien lesen/schreiben angekommen.
Also wollte ich einen kleinen Editor in der Konsole schreiben. Es soll einfach die Datei lesen, den aktuellen Inhalt ausgeben und einen neuen speichern.
Damit ich ein wenig übe habe ich alles in Klassen unterteilt: Die Main Klasse, eine Editor und eine FileHandler Klasse.
Das öffnen geht soweit, nur gibt er leider eine NullPointerExp. zurück, wenn es um die Ausgabe geht.
Hier erst einmal der Quellcode:
Main
EditorCode:import java.io.IOException; public class Main { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { new Editor(); } }
FileHandlerCode:import java.io.IOException; import java.util.Scanner; public class Editor { private String filename = ""; private String filepath = ""; private String newContent = ""; public Editor() throws IOException { Scanner scanner = new Scanner(System.in); System.out.println("In welchem Ordner liegt die Datei? (leer lassen für Standard)"); this.filepath = scanner.nextLine(); System.out.println("Wie ist der Name der Datei?"); this.filename = scanner.nextLine(); FileHandler fh = new FileHandler(this.filepath, this.filename); System.out.println("Datei geöffnet, aktueller Inhalt: "); for (String zeile : fh.getFilecontent()) { System.out.println(zeile); } } }
In der Textdatei steht einfach nur:Code:import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; public class FileHandler { private String filename = ""; private String filepath = ""; private ArrayList<String> filecontent; public FileHandler(String filepathToOpen, String filenameToOpen) throws IOException { this.filename = filenameToOpen; this.filepath = filepathToOpen; this.openFile(); } private void openFile() throws IOException { String zeile = ""; try { FileReader filereader = new FileReader(this.filepath + this.filename); BufferedReader br = new BufferedReader(filereader); do { zeile = br.readLine(); try { System.out.println(zeile); this.filecontent.add(zeile); } catch (Exception ex) { } } while (zeile != null); } catch (FileNotFoundException ex) { System.err.println(ex); } } public ArrayList<String> getFilecontent() { return filecontent; } public void setFilecontent(ArrayList<String> filecontent) { this.filecontent = filecontent; } public boolean saveFile() throws IOException { File datei = new File(this.filepath + this.filename); FileWriter fw = new FileWriter(datei, true); for (String line : this.filecontent) { fw.write(line); } return true; } }
Die Konsolenausgabe sieht wie folgt aus:Hallo
Welt
Die Zeile 22 in der Editor.java ist die folgende:In welchem Ordner liegt die Datei?
C:\Users\alexander\workspace_Tutorial\MiniFileEdit orConsole\
Wie ist der Name der Datei?
text.txt
Datei geöffnet, aktueller Inhalt:
Exception in thread "main" java.lang.NullPointerException
at Editor.<init>(Editor.java:22)
at Main.main(Main.java:11)
Da ich in der FileHandler eigentlich auf NULL prüfe, bevor ich die Daten speichere, wundere ich mich, dass diese Meldung kommt.Code:for (String zeile : fh.getFilecontent()) {
Allgemein: Da ich Anfänger bin, bin ich auch über jedes Kommentar bezüglich des Programmierstiles dankbar.
Einen schönen Freitag wünscht
Alex
Ergebnis 1 bis 6 von 6
Erster Versuch mit Dateien: NullPointerException
Diskussion über Erster Versuch mit Dateien: NullPointerException in Java der Kategorie Programmierung; Hallo! Ich spiele grad ein wenig mit Java und war jetzt bei Dateien lesen/schreiben angekommen. Also wollte ich einen kleinen ...
- 29.06.2012, 06:26 #1
Erster Versuch mit Dateien: NullPointerException
- 29.06.2012, 09:35 #2Reg.-Benutzer
- Reg.-Datum
- 14.06.2012
- Beiträge
- 39
Hiho Devinius,
sorry. Ich habe leider keine Ahnung von Java.
Aber:
Das sieht mir verdächtig aus. Debug doch mal deine Klasse FileHandler. Ich vermute den Fehler in der do...while-Schleife.Code:String zeile = ""; try { FileReader filereader = new FileReader(this.filepath + this.filename); BufferedReader br = new BufferedReader(filereader); do { zeile = br.readLine(); try { System.out.println(zeile); this.filecontent.add(zeile); } catch (Exception ex) { } } while (zeile != null); } catch (FileNotFoundException ex) { System.err.println(ex); }
Mach da mal ein Kopf-gesteuertes Konstruckt a la while(bedingung) { ... DEIN CODE ... } draus (Zeile 22 hat übrigens m.E. nichts mit dem Speichervorgang zu tun... also erstmal nicht).
Was die Struckturierung deines Code angeht: leserlich ist er. Geh mehr Richtung Column-Pattern - spricht: richte z.B. im Bereich der Variablen-Deklaration als Spalte aus, so dass z.B. die Zuweisungoperatoren "=" übereinander stehen.
Ich versteh auch nicht warum die Information zum Speicherort in zwei Klassen vorgehalten werden. In der Klasse Editor und in der Klasse FileHandler. Warum übergibst du nicht eine Objekt-Referenz auf das jeweilige Objekt Editor und rufst die Daten dann von diesem ab? Spart dir eine Zuweisung beim Erzeugen der FileHandler-Klasse.
Auch würde ich die Datenhaltung von der Datenbeschaffung trennen und in einzelne "Schichten?" auslagern. In FileHandler also wirklich nur die Datenbeschaffung programmieren und ggf. eine weitere Klasse für die Datenhaltung schaffen. Wenn das denn überhaupt nötig ist - könnte hier vllt. auch in die Klasse Editor verlagert werden. Davon ausgehend dass die Klasse Editor für jeweils eine einlesbare/einzulesende Datei darstellt - private String newContent = ""; in der Klasse Editor lässt mich das vermuten.
Wenn du Datenbeschaffung und Datenhaltung in der FileHandler-Klasse trennst und Objektreferenzen übergibst, kannst du die Methoden der FileHandler-Klasse statisch implementieren und musst nicht das kmpl. Objekt erzeugen.
Hm, was noch.
public Editor() throws IOException
{
DEIN CODE
}
Ich bin ja eher in C# unterwegs. Deswegen die evtl. saublöde Frage: Das ist der Constructor der Klasse Editor? Ich finde ja man sollte den Constructor Constructor sein lassen. Das Laden der Daten - also Abfrage nach Speicherort und Dateiname, instanzieren der FileHandler-Klasse sowie die Methodenaufrufe zum lesen der Datei - würde ich in separate Methoden der Klasse auslagern.
Joar...
...wie gesagt: Ich habe keine Ahnung von Java
Vllt. hilfts ja trotzdem weiter.
greetz
m.
- 29.06.2012, 09:43 #3
Administrator + Moderator
C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
- Reg.-Datum
- 10.07.2001
- Ort
- Essen
- Beiträge
- 9.409
Ich sehe nirgendwo ein new für filecontent.
"Funktioniert nicht" ist keine ausreichende Problembeschreibung.
- 29.06.2012, 09:44 #4Reg.-Benutzer
- Reg.-Datum
- 14.06.2012
- Beiträge
- 39
S*******.
Daran hatte ich am Anfang auch gedacht.
Es aber verworfen. Weil ich nicht weiss ob das in Java notwendig ist.
Isses wohl. loelz.
- 29.06.2012, 09:48 #5
Mpfh....manchmal sind die Fehler so nah

Das new fehlt ja tatsächlich...das ist es. Jetzt meckert er nicht mehr rum.
Danke dir Klotzkopp!
- 29.06.2012, 10:58 #6
Moderator Java
- Reg.-Datum
- 24.07.2007
- Beiträge
- 8.052
new wird immer benötigt, da alle Datenstrukturen in Java Objekte sind und somit der Konstruktor der Klasse für die Erzeugung im Speicher aufgerufen werden muss (abgesehen von primitiven Datentypen wie z.B. int).
We can only see a short distance ahead, but we can see plenty there that needs to be done. (Alan Turing)
http://flashpixx.de
Aktive Benutzer
Aktive Benutzer
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Ähnliche Themen
-
[FIAE] Erster Versuch - Zeiterfassung
Von rezico im Forum AbschlussprojekteAntworten: 44Letzter Beitrag: 02.02.2011, 23:27 -
Bewerbung, mein erster Versuch. Bitte um Hilfe.
Von deadshox im Forum Jobsuche, Bewerbung und ZeugnisseAntworten: 45Letzter Beitrag: 02.04.2009, 13:32 -
[JAVA] NullPointerException
Von Druid im Forum JavaAntworten: 12Letzter Beitrag: 20.06.2005, 22:31 -
Projektantrag erster Versuch...
Von debitux im Forum AbschlussprojekteAntworten: 9Letzter Beitrag: 13.02.2004, 20:00


1gefällt das
LinkBack URL
About LinkBacks
Zitieren