Hi Forum,
wie in Heft 15 angeregt, habe ich versucht, eine kleine Auto-DB zu
schreiben. Funktioniert prinzipiell ganz gut, ich kann aber keine
Autodaten nachträglich ändern, wenn ich einmal eine “Auto-Datei”
eingelesen habe. Die Klasse Auto6 liefert dann bei der ersten Eingabe
eine NullPointerException.
Wenn ich hingegen keine Datei einlese, sondern erst einmal Autos
anlege, und dann ein beliebiges Auto ändern will, klappt das
reibungslos. Offensichtlich stören sich da FileStream und InputStream
gegenseitig.
Natürlich habe ich schon etliches probiert (BufferedReader-Objekt mit
gleichen/unterschiedlichen Namen, public/private, u.v.m.), aber nix hat
geholfen.
Ich halte mich für einen guten Programmier in anderen Sprachen (VB,
ASP, perl), umso mehr macht es mich “fertig”, diesen Fehler nicht zu
finden. Bitte um Hilfe!
Ich liefere hier den kompletten Source-Code, damit die Sache
nachvollziehbar ist, und ich mir einfach nicht mehr sicher bin, wo denn
der Fehler tatsächlich liegen kann.
Auto6.java:
———————————————————–
import java.io.*;
class Auto6 implements Serializable
{
private String autoeingabe;
String farbe;
int hubraum;
String marke;
transient BufferedReader in;
Auto6() {
in = new BufferedReader( new InputStreamReader( System.in ) );
};
boolean datenEingeben() {
try {
// Farbe erfragen
System.out.println( “Bitte geben Sie die Farbe des ”
“Autos ein (‘q’ = Abbrechen) [" farbe "]:”
);
autoeingabe = in.readLine();
if( autoeingabe.equals( “q” ) ) {
return true;
}
if( !autoeingabe.equals( “” ) ) {
farbe = autoeingabe;
}
// Hubraum erfragen
System.out.println( “Bitte geben Sie den Hubraum des ”
“Autos ein [" hubraum "]:” );
autoeingabe = in.readLine();
if( !autoeingabe.equals( “” ) ) {
hubraum = Integer.valueOf( autoeingabe
).intValue();
}
// Automarke erfragen
System.out.println( “Bitte geben Sie die Marke des ”
“Autos ein [" marke "]:” );
autoeingabe = in.readLine();
if( !autoeingabe.equals( “” ) ) {
marke = autoeingabe;
}
// in.close();
} catch( NullPointerException npe ) {
System.out.println( “NullPointerException in Auto6″ );
System.out.println( npe.toString() );
return true;
} catch( IOException e ) {
System.out.println( “Fehler bei der Dateneingabe” );
return true;
}
return false;
}
String beschreibung() {
return marke “, ” farbe “, ” hubraum “ccm Hubraum.”;
}
};
———————————————————–
und AutoDB.java:
———————————————————–
import java.io.*;
import java.util.Vector;
class AutoDB
{
public static void main( String[] args ) {
String benutzereingabe;
String autodatei;
int AutoNummer;
BufferedReader read_in = new BufferedReader( new
InputStreamReader(System.in));
boolean beenden = false;
Vector autos = null;
System.out.println(“Willkommen zur Autodatenbank”);
System.out.println( “” );
do {
boolean abbrechen = false;
System.out.println(” [0] Anwendung beenden”);
System.out.println(” [1] Datei laden”);
System.out.println(” [2] Neues Auto erfassen”);
System.out.println(” [3] Vorhandenes Auto aendern”);
System.out.println(” [4] Vorhandenes Auto
loeschen”);
System.out.println(” [5] Datei speichern”);
System.out.println(” [6] Alle Autos anzeigen”);
System.out.println( “” );
try {
benutzereingabe = read_in.readLine();
if(benutzereingabe.equals(“1″)) {
System.out.println(“Welche Datei?
[auto.dat]“);
autodatei = read_in.readLine();
if(autodatei.equals(“”)) {
autodatei = “auto.dat”;
}
// Auto6-Objekte aus auto.dat einlesen,
sofern vorhanden
// dazu einen passenden Stream erzeugen
autos = null;
try {
ObjectInputStream file_in =
new ObjectInputStream(
new FileInputStream(
autodatei ) );
// und aus diesem einlesen und
einen Vector erzeugen
autos =
(Vector)file_in.readObject();
// Eingabedatei wird nicht mehr
gebraucht; wieder schließen
file_in.close();
if( autos != null