Problem mit BufferedWriter

  • Themenstarter Themenstarter Wings
  • Beginndatum Beginndatum
W

Wings

Gast
Hey Leute,

ich möchte ein txt erstellen(funktioniert auch) und in diese mehrere Ausgaben speichern. Dafür hab ich eine Klasse deklariert die das steuern soll. Es wird auch geschrieben, nur wenn ich eine andere Methode aufrufe, die eine weitere Zeile schreiben soll (in einer anderen Klasse), gibts nen Fehler .... Könnt ihr mir helfen ...??????
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package +++;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author ++++
 */
public class Statistik {

    BufferedWriter b = null;
    Date date = new Date();

    public void LogErstellen() {
        String DATE_FORMAT = "dd.MM.yyyy hh-mm-ss";
        SimpleDateFormat dt = new SimpleDateFormat(DATE_FORMAT);
        System.out.println("Date = " + dt.format(date));
        try {
            b = new BufferedWriter(new FileWriter("C:/Dokumente und Einstellungen/****/Desktop/Statistik/" + dt.format(date) + ".txt"));
        } catch (IOException ex) {
            Logger.getLogger(Statistik.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void StatArchivAuswahl() {      // FUNKTIONIERT !!!!!!!!!
        try {
            String s = "";
            s = "Anwendername: " + FeAnmeldung.tfName.getText() + " ----- " + date;
            b.write(s);
            b.newLine();
            
        } catch (Exception ex) {
            System.out.println("Fehler beim Stats schreiben");
        }
    }

    public void StatDbAuswahl() {     // HIER DER FEHLER
        try {
            String s = "";
            s = "Ausgewälte Datenbank: " + DbAuswahl.tfDatenbank.getText() + " ----- " + date;
            b.write(s);
            b.newLine();
            b.close();
        } catch (Exception ex) {
            System.out.println("Fehler beim Stats schreiben");
        }
    }
}
 
was ist ein 'Fehler'? Compilerfehler so dass du das Programm gar nicht starten kannst oder Exception zur Laufzeit,
schreibe immer
ex.printStackTrace();
in dein catch um den Fehler auszugeben, und kopiere diese wichtigen Informationen hierher

-----

dein Programm enthält keinerlei Methodenaufrufe/ ablauf,
da kann alles möglich schiefgehen,
z.B. wird StatDbAuswahl() an einen Statistik-Objekt aufgerufen, bei dem b null ist weil LogErstellen() nie ausgeführt wurde
 
Generell ist es immer von Vorteil die Fehlermeldung auch zu posten, und nicht nur zu sagen: "Da ist n Fehler".

Gibt mal mit ex.printStackTrace() die Fehlermeldung aus und poste sie bitte.

Mal davon abgesehen versteh ich grad auch nicht den Sinn deiner Aufsplittung in mehrere Methoden, denn da die 1. Methode den Stream nicht schliesst ist sie zwangsweise auf eine weitere Methode angewiesen. Wäre es nicht besser jedesmal eine neue Verbindung aufzubauen und neu Daten hineinzuschreiben, wenn die Ereignisse unabhängig voneinander geschrieben werden?
 
sorry, ich arbeite immer mit dem debugger
Ich habe ja die Vermutung, dass er die "Vebindung" zum BufferedWriter nicht mehr kennt, durch das close(); der Methode StatArchivAuswahl,wenn ich haber das close nur nach der Methode StatDbAuswahl mache, schreibt er gar nichts



Java:
run:
Date = 14.04.2010 01-55-31
Verbindung zum Treiber/ Datenbank erfolgreich hergestellt
Die Verbindung zur Datenbank wurde geschlossen
Verbindung zum Treiber/ Datenbank erfolgreich hergestellt
java.lang.NullPointerException
        at ****.Statistik.StatDbAuswahl(Statistik.java:51)
        at ****.DbAuswahl.butDbSpeichernActionPerformed(DbAuswahl.java:83)
        at ****.DbAuswahl.access$200(DbAuswahl.java:3)
        at ****.DbAuswahl$3.actionPerformed(DbAuswahl.java:41)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6216)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5981)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4583)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4413)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2475)
        at java.awt.Component.dispatchEvent(Component.java:4413)
Fehler beim Stats schreiben
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
 
eine NullPointerException deutet wie von mir vermutet auf b == null,
was ist das für ein Statistik-Objekt, wer erstellt es wann wo warum wie?

dieser Fehler gehört wahrscheinlich zur Kategorie, die nur im Gesamtkontext eines Programme analysiert werden kann
 
Und die daraus resultierende Frage:
Was steht in Zeile 51?
a) der BufferedWriter: der ist null
b) DbAuswahl.tfDatenbank.getText(): da ist entweder DbAuswahl oder tfDatenbank null
Nachtrag: Ahh sorry, du hast da wirklich 1:1 die Zeilen stehen 😳
...also a 😉
Und noch ein Nachtrag: Vorposter bestätigen. Es ist eigentlich irgendwo was verquer, wenn vorher das Objekt vorhanden ist (siehe 49, 50) und es dann knallt.
Entweder nutzt du Threads oder deine Zeilenangaben haben sich doch verschoben
 
Zuletzt bearbeitet:
Zeilenangaben haben sich durch das einfügen von der exception verschoben, ja dass b== null ist weiss ich , aber warum🙁

Statistik heisst die Klasse, ist keine Methode


Könnte es daran liege, dass die Methode LogErstellen nicht in public DbAuswahl() unter InitComponents is?!, weil, wenn ich in die Methode LogErstellen(); einfüge , gehts... Nur dann hab ich ja wieder ne neue Datei und das will ich ja nicht, ich möchte alles in eine schreiben
Java:
public class DbAuswahl extends javax.swing.JFrame {

    Datenbank db = new Datenbank();
    Statistik st = new Statistik();

    public DbAuswahl() {
        initComponents();
        LogErstellen(); // <-- geht jetz, aber es wird ne neue datei erstellt(ich möchte es in die gleiche schreiben, die beim start des progs aufgerufen wird)
 
> Nur dann hab ich ja wieder ne neue Datei

hier kann man herauslesen dass es irgendwo noch ein anderes Statistik-Objekt gibt?
das wird zum Rätsel-raten

du müsstest auf irgendeinem Weg dafür sorgen, dass das andere Statistik-Objekt auch im JFrame landet, statt dort ein zweites zu erstellen,
z.B. Parameter im Konstruktor wenn der Aufrufer das andere kennt

einfacher wäre, wenn das Statistik global unter einer statischen Variable erreichbar ist,
so wie es mit System.out klappt
 
nein es gibt WIRKLICH kein anderes statistik objekt 😉
Java:
public class Statistik {

    BufferedWriter b = null;
    Date date = new Date();

    public void LogErstellen() {
        String DATE_FORMAT = "dd.MM.yyyy hh-mm-ss";
        SimpleDateFormat dt = new SimpleDateFormat(DATE_FORMAT);
        System.out.println("Date = " + dt.format(date));
        try {
            b = new BufferedWriter(new FileWriter("C:/Dokumente und Einstellungen/Zill/Desktop/Statistik/" + dt.format(date) + ".txt"));
        } catch (IOException ex) {
            Logger.getLogger(Statistik.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
ich meine wenn ich die Methode LogErstellen(); den InitComponents übergebe, wird ne neue Datei erstellt dann ruf ich auf dem nen button die Methode Aus der Klasse Statistik StatDbAuswahl auf und bekomme es in die NEUE Datei . also hab ich dann 2 txt´s im Pfad C:\Dokumente und Einstellungen\****\Desktop\Statistik
Ich möchte aber alles in EINER Datei
hier noch mal die Klasse
C:\Dokumente und Einstellungen\Zill\Desktop\Statistik
 
> bekomme es in die NEUE Datei

wie definiert sich denn die ALTE Datei, worum gehts hier überhaupt?
wenn es nur ein Statistik-Objekt gibt, dann (pro Programmablauf) auch nur eine Datei oder wird LogErstellen() ehrfach aufgerufen?

woran erkennst du dass es zwei Dateien sind oder weißt du auch nicht warum?
wie immer: wer erzeugt wann wo warum Statistiken,

wenn man nur deinen bisher geposteten Code nimmt, mit einem JFrame, das einmal ein Statistik-Objekt erzeugt,
gibt es keinen Grund anzunehmen dass mehrere Dateien erzeugt werden, von mehreren Programmstarts abgesehen,
da ist das ja klar bei genauen Datum im Dateiname


ich glaube ja gerne dass bei dir irgendwas schief läuft und du auch Informationen dazu hast,
aber hier hast du davon bisher wenig verraten


> dann ruf ich auf dem nen button die Methode Aus der Klasse Statistik StatDbAuswahl auf und bekomme es in die NEUE Datei

wie unterscheidet sich denn die neue von der alten? anderes Datum?
baue in LogErstellen() eine Log-Ausgabe (...) ein:
System.out.println("erstelle neue Log-Datei mit Datum: .. ");

dann siehst du, wie oft im Programm LogErstellen() ausgeführt wird, ergo wie viele verschiedene Dateien es gibt,
wenn die Meldung mehr als einmal kommt und du dir das nicht erklären kannst, dann schaue dir die Aufrufer der Methode an,

z.B.
new Error("wo kommst du her").printStackTrace();
liefert einen ähnlichen StackTrace wie zur NullPointerException,
da siehst du Zeile um Zeile wer wen aufruft
 
du hast mir ja per PM den Code geschicht, also:
> es gibt WIRKLICH kein anderes statistik objekt
war wie abzusehen falsch

das erste Statistik-Objekt ist in FeAnmeldung, auch richtig mit LogErstellen()-Aufruf,
das klappt soweit, erstellt eine Log-Datei beim Start

erfolgt eine Anmeldung, dann wird irgendwann das DbAuswahl-Fenster gestartet,
und darin ist auch ein Statistik-Objekt, zweifelsfrei ein zweites oder?
bisher fehlte dort der LogErstellen()-Aufruf, daher die NullPointerException,

wenn du aber in DbAuswahl auch LogErstellen() aufrufst, wie du im Posting 'Gestern, 14:25' zweifelsfrei andeutest,
dann hast du 2x Statistik und 2x LogErstellen() aufgerufen,
wie du unter diesen klaren Umständen auf 'nur eine Statisik' beharrst, ist mir ein Rätsel

FeAnmeldung erzeugt in login() ArchivAuswahl,
ArchivAuswahl erzeugt in irgendeiner actionPerformed DbAuswahl,
es wäre kein Problem, das erste Statistik-Objekt aus FeAnmeldung überall als Parameter durchzureichen statt später ein zweites Statistik-Objekt zu erzeugen
 
Zuletzt bearbeitet von einem Moderator:
Vielen herzlichen dank .... wie reiche ich das Statistik Objekt durch? ....

Werde die Lösung sobald ich alles hinbekommen hab Posten

Lg Wings
 
A hat etwas, x
B soll das auch haben


B b = new B(x); // Parameter in Konstruktor
oder
B b = new B();
b.setX(x) // set-Methode


vergleiche
new SimpleDateFormat(DATE_FORMAT);
 
Ok Läuft :toll:

Java:
 ArchivAuswahl archivAuswahl = new ArchivAuswahl(this.st); //this.st hab ich den Button übergeben 
          archivAuswahl.setVisible(true);
Dann hat NeatBeans nen neuen Konstruktor erzeugt
Java:
 ArchivAuswahl(Statistik st) {
        initComponents();
        this.setSize(350, 230);
        this.setResizable(false);
        int posX = (getToolkit().getScreenSize().width - this.getWidth()) / 2;
        int posY = (getToolkit().getScreenSize().height - this.getHeight()) / 2;
        this.setLocation(posX, posY);
        this.st=st;
    }
stehen alle Werte des ersten Konstruktors drinn, mit dem zusatz: --> this.st=st;<--

Anstatt Statistik mit NEW zu erzeugen hab ich
Java:
public class ArchivAuswahl extends javax.swing.JFrame {

    Datenbank db = new Datenbank();
    Statistik st;
gemacht

Das gleiche dann in der nächsten Klasse DbAuswahl
Java:
public class DbAuswahl extends javax.swing.JFrame {

    Datenbank db = new Datenbank();
    Statistik st;

    public DbAuswahl() {
        initComponents();
        this.setSize(300, 200);
        this.setResizable(false);
        int posX = (getToolkit().getScreenSize().width - this.getWidth()) / 2;
        int posY = (getToolkit().getScreenSize().height - this.getHeight()) / 2;
        this.setLocation(posX, posY);
    }

    DbAuswahl(Statistik st) {
        initComponents();
        this.setSize(300, 200);
        this.setResizable(false);
        int posX = (getToolkit().getScreenSize().width - this.getWidth()) / 2;
        int posY = (getToolkit().getScreenSize().height - this.getHeight()) / 2;
        this.setLocation(posX, posY);
        this.st=st;
    }

Vielleicht könnte ein Mod den Titel umbenennen, weil es ja kein Problem mit dem BufferedWriter ist, sondern mit Referenzen von Methoden auf andere Klassen. Das kann ich jedoch nicht machen, weil ich, als ich das Thema gestartet habe noch nicht registriert war


Danke euch ....

EDIT : Das close(); des Streams des BufferedWriters darf erst nach der letzten Methode der Statistik Klasse erfolgen, weil es sonst ne excepition gibt: Stream ist geschloßen!
Java:
   public void StatArchivAuswahl() {
        Date date = new Date();
        try {
            String s = "";
            s = "Anwendername: " + FeAnmeldung.tfName.getText() + " ----- " + date;
            System.out.println(s);
            b.write(s);
            b.newLine();
           
        } catch (Exception ex) {
            System.out.println("Fehler beim Stats schreiben");
        }
}
            public void StatDbAuswahl() {
        Date date = new Date();
        try {
            String s = "";
            s = "Anwendername: " + DbAuswahl.tfDatenbank.getText() + " ----- " + date;
            System.out.println(s);
            b.write(s);
            b.newLine();
            b.close(); // hier erst den BufferedWriter schießen
        } catch (Exception ex) {
            System.out.println("Fehler");
            ex.printStackTrace();
        }
Lg Wings
 
Zuletzt bearbeitet:

Zurück
Oben