Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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).

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.