Devinius Geschrieben 29. Juni 2012 Teilen Geschrieben 29. Juni 2012 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 import java.io.IOException; public class Main { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { new Editor(); } } Editor 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); } } } FileHandler 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; } } In der Textdatei steht einfach nur: Hallo Welt Die Konsolenausgabe sieht wie folgt aus: In welchem Ordner liegt die Datei? C:\Users\alexander\workspace_Tutorial\MiniFileEditorConsole\ 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) Die Zeile 22 in der Editor.java ist die folgende: for (String zeile : fh.getFilecontent()) { Da ich in der FileHandler eigentlich auf NULL prüfe, bevor ich die Daten speichere, wundere ich mich, dass diese Meldung kommt. Allgemein: Da ich Anfänger bin, bin ich auch über jedes Kommentar bezüglich des Programmierstiles dankbar. Einen schönen Freitag wünscht Alex Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mcn Geschrieben 29. Juni 2012 Teilen Geschrieben 29. Juni 2012 Hiho Devinius, sorry. Ich habe leider keine Ahnung von Java. Aber: 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); } Das sieht mir verdächtig aus. Debug doch mal deine Klasse FileHandler. Ich vermute den Fehler in der do...while-Schleife. 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Juni 2012 Teilen Geschrieben 29. Juni 2012 Ich sehe nirgendwo ein new für filecontent. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mcn Geschrieben 29. Juni 2012 Teilen Geschrieben 29. Juni 2012 S*******. Daran hatte ich am Anfang auch gedacht. Es aber verworfen. Weil ich nicht weiss ob das in Java notwendig ist. Isses wohl. loelz. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Devinius Geschrieben 29. Juni 2012 Autor Teilen Geschrieben 29. Juni 2012 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 29. Juni 2012 Teilen Geschrieben 29. Juni 2012 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). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.