Hallo Liebe leute mein erstes posting hier im forum, und gleich ein problem bei dem ich nicht weiterkome.
Ich hoffe ihr könnt meinem gehirn ein bisschen auf die sprünge helfen :idea:
Ich beschäftige mich gerade mit ein und ausgabestreams, ich hab zur übung dazu mal ein bisschen code geschrieben indem ich die verschiedenen streams und deren methoden ausprobiert habe.
Ich habe 3 verschiedene klassen in dennen tastaureingaben gemacht werden die anschliessend wieder ausgegeben werden, recht simple.
In der main methode erzeuge ich hintereinander diese 3 objekte, TastaturEingabe3, TastaturEingabe, TastaurEingabe2 und rufe deren eingabe und ausgabe methoden auf. Das probelm nun wenn ich das erste objekte Tastaureingabe3 erzeugt habe laufen deren eingabe und ausgabe methoden ohne probelme durch.
In der ausgabe methodevon TastaturEingabe3 schliesse ich am ende alle erzeugten streams.
Nun sollte das nächste objekt TastaturEingabe erzeugt werden allerdings bekomme ich folgende nullpointer exception.
Das objekt TastaturEingabe wird garnicht erzeugt und er kann die ausgabe Methode nicht aufrufen.
Und das liegt anscheinend daran das ich im ersten objekt TastaturEingabe3 am ende der ausgabe methode die erzeugten streams schliesse, entferne ich nämlich das schliessen der streams aus der ausgabe Methode, läuft das programm durch.
Ist mir unerklärlich warum das passiert, sind doch 3 verschieden objekte die ihre eigenen streams besitzen, warum bekomme ich eine nullpointer exception ???
Die main klasse
klasse TastaturEingabe
klasse TastaturEingabe2
klasse TastaturEingabe3
Ich hoffe ihr könnt meinem gehirn ein bisschen auf die sprünge helfen :idea:
Ich beschäftige mich gerade mit ein und ausgabestreams, ich hab zur übung dazu mal ein bisschen code geschrieben indem ich die verschiedenen streams und deren methoden ausprobiert habe.
Ich habe 3 verschiedene klassen in dennen tastaureingaben gemacht werden die anschliessend wieder ausgegeben werden, recht simple.
In der main methode erzeuge ich hintereinander diese 3 objekte, TastaturEingabe3, TastaturEingabe, TastaurEingabe2 und rufe deren eingabe und ausgabe methoden auf. Das probelm nun wenn ich das erste objekte Tastaureingabe3 erzeugt habe laufen deren eingabe und ausgabe methoden ohne probelme durch.
In der ausgabe methodevon TastaturEingabe3 schliesse ich am ende alle erzeugten streams.
Nun sollte das nächste objekt TastaturEingabe erzeugt werden allerdings bekomme ich folgende nullpointer exception.
Code:
Exception in thread "main" java.lang.NullPointerException
at pk1iotest.TastaturEingabe.ausgabe(TastaturEingabe.java:80)
at pk1iotest.PK1IOTest.main(PK1IOTest.java:25)
Java Result: 1
Das objekt TastaturEingabe wird garnicht erzeugt und er kann die ausgabe Methode nicht aufrufen.
Und das liegt anscheinend daran das ich im ersten objekt TastaturEingabe3 am ende der ausgabe methode die erzeugten streams schliesse, entferne ich nämlich das schliessen der streams aus der ausgabe Methode, läuft das programm durch.
Ist mir unerklärlich warum das passiert, sind doch 3 verschieden objekte die ihre eigenen streams besitzen, warum bekomme ich eine nullpointer exception ???
Die main klasse
Java:
public class PK1IOTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
TastaturEingabe3 d=new TastaturEingabe3();
d.einlesen();
d.ausgabe();
TastaturEingabe te=new TastaturEingabe();
te.ausgabe();
TastaturEingabe2 a=new TastaturEingabe2();
a.ausgabe();
a.einlesenInputStream();
a.ausgabe();
}
}
klasse TastaturEingabe
Java:
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");
}
}
}
klasse TastaturEingabe2
Java:
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");
}
}
}
klasse TastaturEingabe3
Java:
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);
isr.close();
osw.close();
pw.close();
}
catch(IOException ioe){
System.out.println("Eine IOException ist aufgetreten");
}
}
private String zuString(){
String wert="";
String separator=System.getProperty("line.separator");
for(int i=0;i<buffer.length;i++){
if(buffer[i] != '\r' && buffer[i] != '\n'){
wert=wert+buffer[i];
}
else{
break;
}
}
return wert;
}
}