Nach schliessen von Streams nullpointer exception

splitterzone

Grünschnabel
Hallo Liebe Leute, ich habe hier gerade ein Problem aus dem ich nicht schlau werde, ich versuche jetzt schon seit 2 Tagen dem Problem auf den grund zu gehen, allerdings ohne erfolg.
Ich beschäftige mich gerade mit Ein und Ausgabestreams in Java, dazu hab ich, zur Übung, ein kleines Programm geschrieben in dem ich die verschiedenen Streamklassen nutze, code seht ihr ja unten.
Also kurz knapp die 3 Klassen TastaturEingabe, TastaturEingabe2 und TastaturEingabe3 lesen einige Eingaben von der Tastatur, speichern diese in Variablen und geben diese wieder aus.
Das Problem nun, die Methoden einlesen und ausgabe aus dem Objekt TastaturEingabe3(das objekt wird als erstes in der main methode erzeugt) laufen ordentlich durch, daten können eingegeben werden und werden auch wieder ausgegeben.
Am ende der ausgabe methode von tastaturEingabe3 schliesse ich alle erzeugten Streams in dem Objekt.
Das hat allerdings zur folge das anschliessend in der Main Methode das Objekt TastaturEingabe nicht mehr erzeugt wird.
Ich kriege dann eine nullpointer exception.
Exception in thread "main" java.lang.NullPointerException
at pk1iotest.TastaturEingabe.ausgabe(TastaturEingabe.java:80)
at pk1iotest.PK1IOTest.main(PK1IOTest.java:25)
Java Result: 1
Schliesse ich die Streams nicht in TastaurEingabe3 und TastaturEingabe so läuft das Programm korrekt durch.
Die Objekte TastaturEingabe und TastaturEingabe2 werden ezeugt und die methoden laufen probelmlos durch.
Das verwundert mich doch sehr, anscheinend erzeugt er er das Objekt TastaturEingabe nicht, und kann daher die methode ausgabe nicht aufrufen, und das nur weil ich in dem Objekt TastaturEingabe3 die Streams schliesse ?
Ich bin echt verwirt, kann mir da jemand erklären wie das zustande kommt ?
Oder hab ich da ein denk oder programmierfehler den ich nicht sehe ?
Ich habe das Programm übrigens in netbeans 7.1 sowie in eclipse ausprobiert immer dieses problem das beim schliessen der streams die nächsten Objekte nicht mehr erzeugt werden und eine nullpointer exception erscheint.
Ich meine die Streams in den jeweiligen objekten sind doch unabhängig voneinander, ich müsste diese doch schliessen können ohne das es in dem anderen Objekt zu schwierigkeiten kommt.

Meine MainKlasse
Code:
package pk1iotest;


public class PK1IOTest {

    
    public static void main(String[] args) {
        
        TastaturEingabe3 d=new TastaturEingabe3();        
        d.einlesen();
        d.ausgabe();
        
        TastaturEingabe te=new TastaturEingabe();
        te.ausgabe();
        
        
        TastaturEingabe2 a=new TastaturEingabe2();
        a.ausgabe();
        a.einlesenInputStream();
        a.ausgabe();
        
        
        
    }
}

Die Klasse TastaturEingabe

Code:
package pk1iotest;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TastaturEingabe {
    private String vorname;
    private String nachname;
    private SimpleDateFormat geburtsdatum;
    private String strasse;
    private int hausnummer;
    private String wohnort;
    private String plz;
    private BufferedInputStream bis;
    private DataInputStream dis;
    private BufferedOutputStream bos;
    private PrintStream ps;
    private DataOutputStream dos;
    
    
    public TastaturEingabe(){
        bis=new BufferedInputStream(System.in);
        dis=new DataInputStream(bis);
        bos=new BufferedOutputStream(System.out);
        dos=new DataOutputStream(bos);
        
        ps=new PrintStream(System.out);
       
            try{
            dos.writeUTF("Im Konstruktorr von TastaturEingabe");
 bos.flush();
           dos.writeUTF("Tastaur Eingabe über BufferedInputStream und DataInputStream um readline Methode aus  DataInputStream nutzen zu können");
            bos.flush();
            ps.println("Diese Zeile wird mir einem PrintStream erzeugt dieser Stellt alle Print Methoden zu verfügung wie printf oder println");
            dos.writeChars("Ein BufferedInputStream wird auf System.in(Tastatur) gesetzt, einem DataInputStream wird der BufferedInputStream übergeben");
            bos.flush();
            ps.println("Somit kann mit dem DataInputStream die komfortable readline methode genutzt werden die eine ganze Zeile einliest");
            ps.println();
            
            System.out.println("Bitte geben Sie ihren Vornamen ein: ");
            this.vorname=dis.readLine();
            System.out.println("Bitte geben Sie ihren Nachnamen ein: ");
            this.nachname=dis.readLine();
            System.out.println("Bitte geben sie ihr geburtsdatum in form von 11.11.1978 ein: ");
            this.geburtsdatum=new SimpleDateFormat(dis.readLine());
            System.out.println("Bitte geben Sie ihre Strasse ein: ");
            this.strasse=dis.readLine();
            System.out.println("Bitte geben Sie ihre Hausnummer ein: ");
            this.hausnummer=Integer.parseInt(dis.readLine());
            System.out.println("Bitte geben Sie ihren Wohnort ein: ");
            this.wohnort=dis.readLine();
            System.out.println("Bitte geben Sie ihre Postleitzahl ein:");
            this.plz=dis.readLine();
            }
        catch (IOException ioe){
            System.out.println("Eine IO Ausnahme ist eingetreten konnte nich einlesen");
        }
       }
    
    public void ausgabe(){
        try{
        ps.println("Ausgabe hier über einen BufferedOutputStream der mit System.out auf den Bildschirm gesetzt wird");
        ps.println("Der BufferedInputStream wird einem PrintStream übergeben dieser hat alle Print methoden Wie println oder printf implementiert");
        System.out.println("Sie haben folgende eingaben getätigt");
        ps.printf("Ihr name: %1$s %2$s %n",this.vorname,this.nachname);
        ps.printf("Ihre Anschrift: %1$s %2$d      %3$s %4$s %n", this.strasse,this.hausnummer,this.plz,this.wohnort);
        ps.printf("Ihr Geburtsdatum: %1$s %n", this.geburtsdatum.toPattern());
        ps.flush();
        
        bis.close();
        dis.close();
        bos.close();
        dos.close();
        ps.close();
        }
        catch(IOException ioe){
            System.out.println("Eine IOException beim schliessen der Streams ist aufgetreten");
        }
        }
    
    
}

Die Klasse Tastatureingabe2

Code:
package pk1iotest;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;


public class TastaturEingabe2 {
    private String Vorname;
    private String nachname;
    private SimpleDateFormat alter;
    private String wohnort;
    private String strasse;
    private String hausnummer;
    private String plz;
    private BufferedReader br;
    private InputStreamReader isr;
    private BufferedWriter bw;
    private OutputStreamWriter osw;
    private PrintWriter pw;
    private DataInputStream dis;
    
    
    public TastaturEingabe2(){
        isr=new InputStreamReader(System.in);
        br=new BufferedReader(isr);
        osw=new OutputStreamWriter(System.out);

        try{
        osw.write("Im Konstruktor von TastaturEingabe2");
        osw.write("Ausgbe über OutputStreamWriter dieser hat write(String methode zum schreeiben von Strings)");
        osw.write("Eingabe über InputStreamReader der mit System.in auf tastatur gesetzt wird");
        osw.write("BufferedReader wird der InputStreamReader übergeben dieser implementiert die readLine Methode um eine ganze zeile einzulesen");
        
        System.out.println();
        System.out.println("Bitte geben Sie ihren Vornamen ein: ");
        this.Vorname=br.readLine();
        System.out.println("Bitte geben Sie ihren Nachnamen ein: ");
        this.nachname=br.readLine();
        System.out.println("Bitte geben Sie ihr alter in der form 11.11.1978 ein: ");
        this.alter=new SimpleDateFormat(br.readLine());
        System.out.println("Bitte geben Sie ihre Strasse ein: ");
        this.strasse=br.readLine();
        System.out.println("Bitte geben Sie ihre Hausnummer ein: ");
        this.hausnummer=br.readLine();
        System.out.println("Bitte geben Sie ihre Postleitzahl ein: ");
        this.plz=br.readLine();
        System.out.println("Bitte geben Sie ihren Wohnort ein: ");
        this.wohnort=br.readLine();
        
        
        }
        catch(IOException ioe){
            System.out.println("IO Fehler beim lesen von Tastatur");
        }
            
}
    public void ausgabe(){
        osw=new OutputStreamWriter(System.out);
        pw=new PrintWriter(osw);
        
       try{
        pw.println("Ausgabe über OutputStreamWriter der mit System.out auf Bildschrim gesetzt wird");
        pw.println("OutputWriter wird einem PrintWriter übergeben Dieser implementiert alle print methoden wie Println oder printf");
        pw.println("Man könnte auch direkt mit dem OutputStreamWriter und seiner write(String Mehtode) ausgeben, allerdings sind die print methoden komfortabler");
        pw.println();
        System.out.println("Sie habeen folgende eingabe getätigt");
        pw.printf("Ihr Name ist: %1$s %2$s %n",this.Vorname,this.nachname);
        pw.printf("Sie sind am %1$s geboren %n",this.alter.toPattern());
        pw.printf("Ihre anschrift ist: %1$s %2$s  %3$s %4$s %n",this.strasse,this.hausnummer,this.plz,this.wohnort);
        
        
        br.close();
        pw.close();
       }
       catch(IOException ioe){
           System.out.println("Eine IOException bei der Ausgabe ist aufgetreten");
       }
      
       System.out.println();
       System.out.println();
    }
    
    public void einlesenInputStream(){
        
        char[] buffer=new char[256];
        isr=new InputStreamReader(System.in);
        
        
        System.out.println("Hier wird über ein InputStream Reader eingelesen dieser hat lediglich einige read Methoden zur verfügung");
        System.out.println("read() liest ein zeichen im Unicode Format also 16bit ein read(char[] buffer) liest einzelne char zeichen in char array ein");
        System.out.println("Diese einlesen in ein char Array wird hier benutzt");
        System.out.println();
        
        try{
        System.out.println("Bitte geben Sie ihren Vornamen ein: ");
        isr.read(buffer); 
        this.Vorname=buffer.toString();
        System.out.println("Bitte geben Sie ihren Nachnamen ein: ");
        isr.read(buffer);
        this.nachname=buffer.toString();
        System.out.println("Bitte geben Sie ihr alter in der form 11.11.1978 ein: ");
        isr.read(buffer);
        this.alter=new SimpleDateFormat(buffer.toString());
        System.out.println("Bitte geben Sie ihre Strasse ein: ");
        isr.read(buffer);
        this.strasse=buffer.toString();
        System.out.println("Bitte geben Sie ihre Hausnummer ein: ");
        isr.read(buffer);
        this.hausnummer=buffer.toString();
        System.out.println("Bitte geben Sie ihre Postleitzahl ein: ");
        isr.read(buffer);
        this.plz=buffer.toString();
        System.out.println("Bitte geben Sie ihren Wohnort ein: ");
        isr.read(buffer);
        this.wohnort=buffer.toString();
        
        }
        catch(IOException ioe){
            System.out.println("IO Fehler beim lesen von Tastatur");
        }
    }
}

Die Klasse TastaturEingabe3

Code:
package pk1iotest;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Arrays;

public class TastaturEingabe3 {
    private String Vorname;
    private String nachname;
    private SimpleDateFormat alter;
    private String wohnort;
    private String strasse;
    private String hausnummer;
    private String plz;
    private BufferedReader br;
    private InputStreamReader isr;
    private BufferedWriter bw;
    private OutputStreamWriter osw;
    private PrintWriter pw;
    private DataInputStream dis;
    private char[] buffer=new char[20];
    
    public TastaturEingabe3(){
    System.out.println("Im konstruktor von TastaturEingabe3");    
    }
    
     public void einlesen(){
        isr=new InputStreamReader(System.in);
        
        System.out.println("Hier wird über ein InputStream Reader eingelesen dieser hat lediglich einige read Methoden zur verfügung");
        System.out.println("read() liest ein zeichen im Unicode Format also 16bit ein read(char[] buffer) liest einzelne char zeichen in char array ein");
        System.out.println("Diese einlesen in ein char Array wird hier benutzt");
        System.out.println();
        
        try{
        System.out.println("Bitte geben Sie ihren Vornamen ein: ");
        isr.read(buffer); 
        this.Vorname=zuString();
        
        System.out.println("Bitte geben Sie ihren Nachnamen ein: ");
        
        isr.read(buffer);
        this.nachname=zuString();
        
        System.out.println("Bitte geben Sie ihr alter in der form 11.11.1978 ein: ");
        isr.read(buffer);
        this.alter=new SimpleDateFormat(zuString());
        
        System.out.println("Bitte geben Sie ihre Strasse ein: ");
        isr.read(buffer);
        this.strasse=zuString();
       
        System.out.println("Bitte geben Sie ihre Hausnummer ein: ");
        isr.read(buffer);
        this.hausnummer=zuString();
        
        System.out.println("Bitte geben Sie ihre Postleitzahl ein: ");
        isr.read(buffer);
        this.plz=zuString();
        
        System.out.println("Bitte geben Sie ihren Wohnort ein: ");
        isr.read(buffer);
        this.wohnort=zuString();
       
        }
        catch(IOException ioe){
            System.out.println("IO Fehler beim lesen von Tastatur");
        }
       
    }
     
    public void ausgabe(){
        osw=new OutputStreamWriter(System.out);
        pw=new PrintWriter(osw);
        
        try{
        pw.println("Ausgabe über OutputStreamWriter der mit System.out auf Bildschrim gesetzt wird");
        pw.println("OutputWriter wird einem PrintWriter übergeben Dieser implementiert alle print methoden wie Println oder printf");
        pw.println("Man könnte auch direkt mit dem OutputStreamWriter und seiner write(String Mehtode) ausgeben, allerdings sind die print methoden komfortabler");
        pw.println();
        pw.println("Sie habeen folgende eingabe getätigt");
        pw.printf("Ihr Name ist: %1$s %2$s %n",this.Vorname,this.nachname);
        pw.printf("Sie sind am %1$s geboren %n",this.alter.toPattern());
        pw.printf("Ihre anschrift ist: %1$s %2$s  %3$s %4$s %n",this.strasse,this.hausnummer,this.plz,this.wohnort);
        pw.flush();
        isr.close();
        pw.close();
     }
    catch(IOException ioe){
        System.out.println("Eine IOException ist aufgetreten");
    }
       
    }
    
    private String zuString(){
       String wert="";
       String separator=System.getProperty("line.separator");
       /*char[] sepa=separator.toCharArray();
      System.out.println("separator als chararray länge: "+sepa.length);
           System.out.print("Inhalt von sepa[0] als dezimalzahl: "+Character.getNumericValue(sepa[0]));
           System.out.println("Inhalt von sepa[1] als deezimalzahl: "+Character.getNumericValue(sepa[1]));
       System.out.printf("Inhalt von sepa als hexzahl: %1$x",Character.getNumericValue(sepa[0]));
       System.out.println(separator.length());
       System.out.println(separator.endsWith(separator));
       System.out.println(Arrays.toString(buffer));
       System.out.println(buffer.length);
       System.out.println("Punkt als dezimalzahl"+Character.getNumericValue('.'));
        */
       for(int i=0;i<buffer.length;i++){
          if(buffer[i] != '\r' || buffer[i] != '\n'){
              wert=wert+buffer[i];
          }
          else{
              break;
          }
       }
       return wert;
    }
}

Ich steig da echt nicht durch die 3 objekte haben doch alle ihre eigenen streams und sind unabhängig voneinander, wieso dann eine nullpointer exception wenn ich die streams im jeweiligen objekt schliesse ?
 
Zuletzt bearbeitet:

j2se

Erfahrenes Mitglied
Die Fehlermeldung hat nichts mit den Steams zu tun, sondern damit, dass die Referenz geburtsdatum nie initialisiert wird. Wenn man nun versucht, darauf eine Methode wie toPattern() aufzurufen, wirft der Compiler zu Recht die Fehlermeldung: java.lang.NullPointerException. Dito für alter. Ein simples geburtsdatum = new SimpleDateFormat("dd.mm.yyyy"); kann den Fehler vermeiden!