Umwandlung von Sonderzeichen in HTML-Datei mit Ausgabe

Status
Nicht offen für weitere Antworten.

Semox

Bekanntes Mitglied
Hallo Java Forum

Ich habe hier eine Problem mit einer NullPointer Exception. Ich weiß leider nicht was man da machen muß. Ich habe anbei den Quelltext meines Programms, der das Folgende tun soll:

1. Einlesen einer HTML Datei von einem beliebigen Ort aus.
2. Angabe des Speicherorts für die Ausgabe der korrigierten Daten.
3. Zeilenweises Einlesen und Prüfen auf Umlaute via vorprüfender Schleife
4. Zeilenweises Schreiben der veränderten Inhalte in eine andere HTML Datei.

Ich hoffe Ihr könnt mir sagen, wie ich das richtig machen muß.


Lieben Dank,
Semo

Was die Kommandozeile auswirft:
Code:
init:
deps-jar:
compile-single:
run-single:
##############################################################
Programm zum Pruefen und Ersetzen von Umlauten in HTML-Dateien
##############################################################

Bitte geben Sie den kompletten Dateinamen der HTML Datei ein:
c:\vo.html
Danke.
Bitte geben Sie nun den vollstaendigen Namen der zu erzeugende Datei mit korrigierten Inhalt an:
c:\nach.html

c:\vo.html

c:\nach.html
Exception in thread "main" java.lang.NullPointerException
        at java.io.Writer.write(Writer.java:140)
        at le02_htmlconv.main(le02_htmlconv.java:65)
Java Result: 1
BUILD SUCCESSFUL (total time: 28 seconds)




Der QUELLTEXT:

Code:
/**
 * Beschreibung 
 * @author Sebastain Morkisch
 * @date 14.10.2008
 * @version 0.9
 */

import java.io.*;

public class le02_htmlconv implements Serializable {
    
    public static void main(String[] args) throws IOException {
    
        System.out.println("##############################################################");
        System.out.println("Programm zum Pruefen und Ersetzen von Umlauten in HTML-Dateien");
        System.out.println("##############################################################");
        System.out.println();
        
        //Vorbereitung etwas aus der Konsole zu lesen
        String DateinameEIN = "";
        String DateinameAUS = "";
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        //Einlesen des Dateipfades
        System.out.println("Bitte geben Sie den kompletten Dateinamen der HTML Datei ein:");
        DateinameEIN = br.readLine();
        System.out.println("Danke.");
        System.out.println("Bitte geben Sie nun den vollstaendigen Namen der zu erzeugende Datei mit korrigierten Inhalt an:");
        DateinameAUS = br.readLine();
        
        //Test auf Einleseschwierigkeiten
        System.out.println();
        System.out.println(DateinameEIN);
        
        System.out.println();
        System.out.println(DateinameAUS);
        
        //Konstruktor zum Einlesen einer Datei, sowie Umwandlung des Bytestroms in Char-Data mit Unterstuetzung eines Puffers.
        FileInputStream fiStream = new FileInputStream(DateinameEIN);
        InputStreamReader iStreamR = new InputStreamReader(fiStream);
        BufferedReader buffRead = new BufferedReader(iStreamR);
        
        String inhalt = "";
        
        //Zeilenweises Pruefen und Ersetzen des HTML Inhalts
        while (true) {
            inhalt = buffRead.readLine();
            //Bei erreichen des Dateiendes, Abbruch des Einlesens und Pruefens
            if (inhalt == null) break;
        
            inhalt = inhalt.replace("ß", "&_szlig;"); //habe ein underscore gesetzt, damit das Forum das Zeichen nicht interpretiert
            inhalt = inhalt.replace("ä", "&_auml;");
            inhalt = inhalt.replace("Ä", "&_Auml;");
            inhalt = inhalt.replace("ö", "&_ouml;;");
            inhalt = inhalt.replace("Ö", "&_Ouml;");
            inhalt = inhalt.replace("ü", "&_uuml;");
            inhalt = inhalt.replace("Ü", "&_Uuml;");
        }
        
        //Konstruktion der Ausgabestroeme
        FileOutputStream foStream = new FileOutputStream(DateinameEIN);
        OutputStreamWriter oStreamW = new OutputStreamWriter(foStream);
        BufferedWriter buffWrite = new BufferedWriter(oStreamW);
        
        //Zeilenweises Schreiben ersetzter Inhalte
        buffWrite.write(inhalt);
        buffWrite.newLine();
        
        //Schliessung aller offenen IOps
        buffRead.close();
        buffWrite.close();
        }
    }
 
die variable inhalt ist null. wenn du aus der Whileschleife rausgehst (und du gehst da wirklich nur dann raus, wenn inhalt null ist) ist inhalt null. und dann gibt es ein KnallPointerException beim write()
 
deine while-Schleife endet, wenn inhalt null ist (Zeile 50)

nach der Schleife ist inhalt also null, um es nochmal zu sagen,
in Zeile 67 schreibst du inhalt in die Datei, inhalt ist null, es gibt eine NullPointerException,
keine Idee für Zusammenhänge?

alle anderen inhalt-Zeilen aus der while-Schleife werden übrigens bisher nicht genutzt,
es bietet sich an, die Zeilen 67 und 68 in die Schleife zu verlegen
 
Hallo ihr beiden

Danke für die schnelle Antwort.

Ich glaube es zu verstehen und würde es gern nachvollziehen. Mein Problem ist also, daß ich statt zu prüfen, ob das Dateiende erreicht ist, bereits nach dem ersten Durchgang den Stringinhalt von "inhalt" auf NULL setze und dann beim nächsten Schleifendurchlauf nur noch NULL erhalte, statt einer Referenz auf Stringobjekt? Kommt es dadurch zu diesem Ausnahmefehler?

Falls ich falsch liege korrigiert mich bitte.

lg,
Semo
 
1)
Code:
//OMFG!
& & & &
Sag mal, hälst du diejenigen, die diesen code-tag da eingebaut haben für total bescheuert? 😉
EDIT: sorry, die leute, die diesen tag gebaut haben, sind total bescheuert, habs eben auch mit dem a-umlaut versucht ???:L
2)
Nein. Du ließt in der while-schleife alles zeilenweise raus. In jeder ausgelesenen Zeile nimmst du irgendwelche änderungen vor. Dann schmeisst du die abgeänderte Zeile raus, ohne die irgendwohin zu schreiben.

Erst wenn nichts mehr da ist, und du für inhalt "null" bekommst, gehst du aus der schleife raus, und versuchst irgendwas zu schreiben, was selbstverständlich mit einer Exception endet... Wie SlaterB bereits gesagt hat: alle schreibbefehle müssen auch in die while-schleife rein.
 
Hallo Andrey

Zu 1)
Verstehe ich nicht. Wenn Du das mit dem Underscore meinst, dann füge doch mal ein & ein und der Kram wird interpretiert, solange es sich im Code Tag befindet...

Oder was meinste?

Zu 2)

Vielen Dank. Jetzt verstehe ich. Ich probiere es nochmal richtig zu machen.

Viele Grüße
SemoX
 
zu 1) : ja, wie gesagt, entschuldigung, dieser bug ist mir bisher merkwürdigerweise nicht aufgefallen :shock:
 
Hallo zusammen

Jetzt geht es. Zur Lösung:

In Zeile 62 habe ich statt "DateiAUS" die Variable "DateiEIN" verwechselt.

Und wie SlaterB richtig vorgeschlagen hat, habe ich die Schleife nur ergänzt.

Anbei das Fragment von Zeile 47-59:

Code:
while (true) {
            inhalt = buffRead.readLine();
            //Bei erreichen des Dateiendes, Abbruch des Einlesens und Pruefens
            if (inhalt == null) break;
        
            //Ersetzung aller Umlaute
            inhalt = inhalt.replace("ß", "&");
            inhalt = inhalt.replace("ä", "&");
            inhalt = inhalt.replace("Ä", "Ä");
            inhalt = inhalt.replace("ö", "&");
            inhalt = inhalt.replace("Ö", "Ö");
            inhalt = inhalt.replace("ü", "&");
            inhalt = inhalt.replace("Ü", "Ü");
            
            //Zeilenweises Schreiben ersetzter Inhalte
            [color=red]buffWrite.write(inhalt);
            buffWrite.newLine();   [/color]     
        }

Ich danke allen für die Hilfe.

lg,
SemoX
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben