Zum Inhalt springen

Erster Versuch mit Dateien: NullPointerException


Devinius

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...