Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Laden und Speichern von Objekten (Autos / Filialen)
Hallo zusammen,
ich musste zwecks Programmier-Hausarbeit ein Programm zum Vermieten von Autos schreiben. Das habe ich auch so weit geschafft nur leider komme ich mit dem Speichern und Laden der vorh. Filialen und Autos nicht zurecht.
Wäre super wenn mir da jemand weiter helfen könnte. Verkürzt sieht das so aus (Hoffe nicht zu langer Beitrag ):
Klasse Auto:
Code:
import java.io.*;
public class Auto implements Serializable {
private String hersteller, modell;
private int filiale;
public Auto (String hersteller1, String modell1, int fil)
{
hersteller = hersteller1;
modell = modell1;
filiale = fil;
}
public String zeigeAuto()
{
String ausgabe = hersteller + " " + modell + " ("+filiale+")";
return (ausgabe);
}
}
Klasse Filiale:
Code:
import java.io.*;
public class Filiale implements Serializable {
static int lfdNr = 0;
String ortsname, ortskürzel;
int filialNr;
Auto[] auto = new Auto[20];
int autoZahl = 0;
public Filiale (String stadtname, String stadtkürzel)
{
ortsname = stadtname;
ortskürzel = stadtkürzel;
filialNr = lfdNr;
autoZahl = 0;
lfdNr++;
}
public boolean neuesAuto (String hersteller, String modell)
{
if (autoZahl <=20)
{
auto[autoZahl] = new Auto (hersteller, modell, filialNr);
autoZahl++;
return (true);
}
else
{
return (false);
}
}
public String zeigeAuto(int autoNr)
{
String ausgabe = auto[autoNr].zeigeAuto();
return (ausgabe);
}
public String zeigeAlle()
{
String ausgabe = "Fahrzeug-Bestand der Filiale "+filialNr+" in "+ortsname+":\n";
for (int i=0; i<autoZahl; i++)
{
if (i<10)
{
ausgabe = ausgabe+' ';
}
ausgabe = ausgabe + " "+i+".) "+auto[i].zeigeAuto()+"\n";
}
return (ausgabe);
}
public void speicherAuto (int index)
{
try
{
OutputStream fos = new FileOutputStream("car.dat");
ObjectOutputStream o = new ObjectOutputStream(fos);
o.writeObject(auto[index]);
}
catch ( IOException e ) { System.err.println( e ); }
}
public void autoLaden (int index)
{
try
{
InputStream fis = new FileInputStream("car.dat");
ObjectInputStream o = new ObjectInputStream(fis);
Auto auto;
auto = (Auto) o.readObject();
}
catch ( IOException e ) { System.err.println( e ); }
catch ( ClassNotFoundException e ) { System.err.println( e ); }
}
}
Klasse Zentrale:
Code:
import java.io.*;
public class Zentral implements Serializable {
Filiale[] filiale;
int filZahl=0;
Auto[] gesamt;
int gesZahl = 0;
public Zentral ()
{
filZahl = 2;
filiale = new Filiale[filZahl];
gesamt = new Auto[filZahl*20];
filiale[0] = new Filiale ("Düsseldorf","D");
filiale[1] = new Filiale ("Neuss","NE");
/*filiale[0].neuesAuto ("VW","Golf"); <- Ursprünglich zum Erstellen neuer Autos beim Start
filiale[0].neuesAuto ("Ford","Focus"); <- Gespeichert
filiale[0].neuesAuto ("Opel","Meriva");
filiale[1].neuesAuto ("VW","Passat");
filiale[1].neuesAuto ("Toyota","Corolla"); */
}
public String zeigeAutosFilialweise()
{
String aus = "";
for (int f=0; f<filZahl; f++)
{
aus = aus + filiale[f].zeigeAlle();
}
return (aus+"\n");
}
public void autoSpeichern (int fil, int index)
{
filiale[fil].speicherAuto(index);
}
public void autoLaden ()
{
filiale[0].autoLaden(1);
}
public String zeigeAuto (int filNr, int autoNr)
{
String ausgabe = filiale[filNr].zeigeAuto(autoNr);
return (ausgabe);
}
}
Frage 1: Das Auto Ford Focus (Filiale 0, Auto 1) wurde erfolgreich gespeichert. Wenn ich das aber jetzt lade sind die Filialen leer. Woran liegt das?
Frage 2: Muss ich jedes Auto einzeln speichern oder gibt es eine Möglichkeit alle Autos und Filialen auf einmal zu speichern?
> Wenn ich das aber jetzt lade sind die Filialen leer.
ich kann in deinem Code nicht feststellen, wie du zu dieser Erkenntnis kommst, Filialen werden nirgendwo gespeichert oder sonst wie bearbeitet,
Autos speicherst du evtl., ja, und wenn du sie lädst verwendest du sie nirgendwo weiter im Programm,
aber was hat das mit Filialen zu tun?
da letztlich nicht mal eine main-Operation vorhanden ist, erübrigt sich jede Detailsuche,
poste ein vollständiges Programm und beschreibe genau was in welchem Programmschritt deiner Meinung nach falsch läuft,
wo du Daten erwartest, aber nicht vorhanden sind, dann kann man das gut erklären
---------
> Muss ich jedes Auto einzeln speichern oder gibt es eine Möglichkeit alle Autos und Filialen auf einmal zu speichern?
wenn du mehrmals Autos einzeln in "car.dat" speicherst, löschst du jeweils die vorherige Datei
du kannst aber in einem Schreibvorgang mehrmals o.writeObject() aufrufen,
dann werden mehrere Autos in eine Datei geschrieben
komfortabler: schreibe in einem Aufruf ein ganzes Array oder eine Liste in die Datei,
bedenke dann aber, dass du auch genau das gleiche wieder herauslesen musst,
am komfortablesten: speichere das Zentral-Objekt in eine Datei,
dann werden automatisch alle referenzierten Objekte, also alle Autos + Filialen mit gespeichert
Meinte natürlich Autos, aber hat sich eh erledigt da ich das Programm geändert habe um
SlaterB hat gesagt.:
am komfortablesten: speichere das Zentral-Objekt in eine Datei, dann werden automatisch alle referenzierten Objekte, also alle Autos + Filialen mit gespeichert
zu nutzen.
Das funktioniert in der kleinen Version auch 1A und ich danke dir schonmal sehr für die Hilfe, nur in der Großen hab ich leider noch Probleme. Ich weiß da leider nicht wie ich die Verbindung zum geladenen Objekt Zentrale herstelle.
Klasse Start:
Code:
import java.io.*;
public class Start {
public static void main (String[] args)
{
try
{
InputStream fis = new FileInputStream("car.dat");
ObjectInputStream o = new ObjectInputStream(fis);
Zentrale firma;
firma = (Zentrale) o.readObject();
Autovermietung.fuereAus();
}
catch ( IOException e ) { System.err.println( e ); }
catch ( ClassNotFoundException e ) { System.err.println( e ); }
}
}
public void NaOKActionPerformed(ActionEvent evt) {
// Bestätigung Neues Auto
if (jTextField1.getText().equals("") || jTextField2.getText().equals("") || jTextField3.getText().equals("") || jTextField4.getText().equals("")
|| jTextField5.getText().equals("") || jTextField6.getText().equals("") || jTextField7.getText().equals("") ||
jTextField8.getText().equals("") || jTextField9.getText().equals("")) // Prüfen ob Eingabe stattgefunden hat
{
Ausgabe.append("\nBitte alle Felder ausfüllen.\n");
}
else
{
try
{
int filNr = Integer.parseInt(jTextField1.getText());
int sitze = Integer.parseInt(jTextField5.getText());
int kmStand = Integer.parseInt(jTextField6.getText());
int nr = Integer.parseInt(jTextField9.getText());
if (filNr>=0 && filNr<firma.filZahl) // Prüfen ob eingegebene Zahl, einer Filialzahl entspricht
{
Kennzeichen test = new Kennzeichen (jTextField7.getText(), jTextField8.getText(), nr);
if (test.gültig())
{
if (firma.neuesAuto(jTextField2.getText(), jTextField3.getText(), jTextField4.getText(), sitze,
jTextField7.getText(), jTextField8.getText(), nr, kmStand, filNr))
{
int autoNr = firma.letzteNr(filNr);
Ausgabe.append ("\nDas Auto, "+firma.zeigEinAuto(filNr, autoNr-1)+"wurde erfolgreich der Filiale "
+firma.zeigeFiliale(filNr)+" hinzugefügt.");
jTextField1.setText("");
jTextField2.setText("");
jTextField3.setText("");
jTextField4.setText("");
jTextField5.setText("");
jTextField6.setText("");
jTextField7.setText("");
jTextField8.setText("");
jTextField9.setText("");
speichern();
}
else
{
Ausgabe.append ("\nProbleme bei der Aufnahme: Zuviel, doppeltes Kennzeichen,... ?\n");
}
}
else
{
Ausgabe.append ("\nUngültiges Kennzeichen.\n");
}
}
else
{
Ausgabe.append ("\nFalsche Filialnummer. Filialnummer muss zwischen 0 und "+(firma.filZahl-1)+" liegen.\n");
}
}
catch (NumberFormatException nfe) // Prüfen ob eine Zahl eingegeben wurde (im jeweiligen Feld)
{
Ausgabe.append ("\nBitte für Filialnummer, Sitzplätze, Kilometerstand und Kennzeichennummer nur Zahlen eingeben.\n");
}
}
}
public void gesamtListeActionPerformed(ActionEvent evt) {
firma.sortiereAutosInsgesamt();
Ausgabe.append (firma.zeigeAutosInsgesamt());
}
public void nachFilialeActionPerformed(ActionEvent evt) {
firma.sortiereAutosFilialweise();
Ausgabe.append (firma.zeigeAutosFilialweise());
}
public void bEinzelFilActionPerformed(ActionEvent evt) {
if (tfEinzelFil.getText().equals("")) // Prüfen ob Textfeld "tfEinzelFil" leer ist
{
Ausgabe.append ("\nBitte Filialnummer eingeben.\n");
}
else
{
try
{
int filZahl = Integer.parseInt(tfEinzelFil.getText());
if (filZahl>=0 && filZahl<firma.filZahl) // Prüfen ob eingegebene Zahl, einer Filialzahl entspricht
{
firma.sortiereAutosFilialweise();
Ausgabe.append (firma.zeigEineFiliale(filZahl));
}
else
{
Ausgabe.append ("\nFalsche Filialnummer. Filialnummer muss zwischen 0 und "+(firma.filZahl-1)+" liegen.\n");
}
}
catch (NumberFormatException nfe) // Prüfen ob eine Zahl eingegeben wurde
{
Ausgabe.append ("\nBitte nur eine Zahl eingeben.\n");
}
}
}
public void bAdelResetActionPerformed(ActionEvent evt) {
// Eingabefelder Auto löschen zurücksetzen
tfANr.setText("");
tfFNr.setText("");
}
public void AdelLoeActionPerformed(ActionEvent evt) {
// Auto löschen bestätigen
if (tfANr.getText().equals("") || tfFNr.getText().equals(""))
{
Ausgabe.append ("Bitte eine Filialnummer und eine Autonummer eingeben.\n");
}
else
{
try
{
int aNr = Integer.parseInt(tfANr.getText());
int fNr = Integer.parseInt(tfFNr.getText());
if (fNr>=0 && fNr<firma.filZahl) // Prüfen ob eingegebene Zahl, einer Filialzahl entspricht
{
int autoNr = firma.letzteNr(fNr);
if (aNr<=autoNr-1) // Prüfen ob eingegebene Zahl, einer Autozahl entspricht
{
// Methode Auto löschen aufrufen
firma.autoLoeschen(fNr, aNr);
Ausgabe.append ("\nAuto erfolgreich gelöscht.\n");
tfANr.setText("");
tfFNr.setText("");
speichern();
}
else
{
Ausgabe.append ("\nFalsche Autonummer. Autonummer muss zwischen 0 und "+(aNr-1)+" liegen.\n");
}
}
else
{
Ausgabe.append ("\nFalsche Filialnummer. Filialnummer muss zwischen 0 und "+(firma.filZahl-1)+" liegen.\n");
}
}
catch (NumberFormatException nfe) // Prüfen ob eine Zahl eingegeben wurde
{
Ausgabe.append ("\nBitte nur Zahlen eingeben.\n");
}
}
}
public void bFilResetActionPerformed(ActionEvent evt) {
// Eingabefelder Neue Filiale zurücksetzen
int filNr = firma.filZahl;
String fil = String.valueOf(filNr);
tfFNr2.setText(fil);
tfStadName.setText("");
tfStadtkuerzel.setText("");
}
public void bFilOkActionPerformed(ActionEvent evt) {
// Bestätigung Neue Filiale
if (tfStadName.getText().equals("") || tfStadtkuerzel.getText().equals(""))
{
Ausgabe.append ("\nBitte Stadtname und -kürzel eingeben.\n");
}
else
{
int filAnzahl = firma.filZahl;
if (filAnzahl<20)
{
int filNr = firma.filZahl;
firma.neueFiliale(tfStadName.getText(), tfStadtkuerzel.getText());
Ausgabe.append ("\nFiliale "+firma.zeigeFiliale(filNr)+", wurde erfolgreich aufgenommen.\n");
int neueFilNr = firma.filZahl;
String fil = String.valueOf(neueFilNr);
tfFNr2.setText(fil);
tfStadName.setText("");
tfStadtkuerzel.setText("");
speichern();
}
else
{
Ausgabe.append ("\nFilialliste voll.\n");
}
}
}
public void bFdelLoeActionPerformed(ActionEvent evt) {
// Filiale Löschen bestätigen
if (tfFNr3.getText().equals(""))
{
Ausgabe.append ("\nBitte eine Filialnummer eingeben.\n");
}
else
{
try
{
int fNr = Integer.parseInt(tfFNr3.getText());
if (fNr>=0 && fNr<firma.filZahl) // Prüfen ob eingegebene Zahl, einer Filialzahl entspricht
{
firma.filLoeschen(fNr);
Ausgabe.append ("\nFiliale erfolgreich gelöscht.\n");
tfFNr3.setText("");
speichern();
}
else
{
Ausgabe.append ("\nFalsche Filialnummer. Filialnummer muss zwischen 0 und "+(firma.filZahl-1)+" liegen.\n");
}
}
catch (NumberFormatException nfe) // Prüfen ob eine Zahl eingegeben wurde
{
Ausgabe.append ("\nBitte nur eine Zahl eingeben.\n");
}
}
}
public void bVerleihenActionPerformed(ActionEvent evt) {
// Autoverleih bestätigen
if (tfAutoNrVerl.getText().equals("") || tfFilNrVerl.getText().equals(""))
{
Ausgabe.append ("Bitte eine Filialnummer und eine Autonummer eingeben.\n");
}
else
{
try
{
int aNr = Integer.parseInt(tfAutoNrVerl.getText());
int fNr = Integer.parseInt(tfFilNrVerl.getText());
if (fNr>=0 && fNr<firma.filZahl) // Prüfen ob eingegebene Zahl, einer Filialzahl entspricht
{
int autoNr = firma.letzteNr(fNr);
if (aNr<=autoNr-1) // Prüfen ob eingegebene Zahl, einer Autozahl entspricht
{
if (firma.autoVerleih(fNr, aNr))
{
Ausgabe.append ("\nDas Auto, "+firma.zeigEinAuto(fNr, aNr)+", wurde erfolgreich verliehen.\n");
speichern();
}
else
{
Ausgabe.append ("\nDas Auto ist bereits verliehen.\n");
}
}
else
{
Ausgabe.append ("\nFalsche Autonummer. Autonummer muss zwischen 0 und "+(aNr-1)+" liegen.\n");
}
}
else
{
Ausgabe.append ("\nFalsche Filialnummer. Filialnummer muss zwischen 0 und "+(firma.filZahl-1)+" liegen.\n");
}
}
catch (NumberFormatException nfe) // Prüfen ob eine Zahl eingegeben wurde
{
Ausgabe.append ("\nBitte nur Zahlen eingeben.\n");
}
}
}
public void bOkZurueckActionPerformed(ActionEvent evt) {
// Autorückgabe bestätigen
if (tfAutoNrRueck.getText().equals("") || tfFilNrRueck.getText().equals("") || tfGefahreneKm.getText().equals(""))
{
Ausgabe.append ("Bitte eine Filialnummer, Autonummer und die gefahrenen Kilometer eingeben.\n");
}
else
{
try
{
int aNr = Integer.parseInt(tfAutoNrRueck.getText());
int fNr = Integer.parseInt(tfFilNrRueck.getText());
int kM = Integer.parseInt(tfGefahreneKm.getText());
if (fNr>=0 && fNr<firma.filZahl) // Prüfen ob eingegebene Zahl, einer Filialzahl entspricht
{
int autoNr = firma.letzteNr(fNr);
if (aNr<=autoNr-1) // Prüfen ob eingegebene Zahl, einer Autozahl entspricht
{
if (firma.autoRuecknahme(fNr, aNr, kM))
{
Ausgabe.append ("\nDas Auto, "+firma.zeigEinAuto(fNr, aNr)+", wurde erfolgreich zurückgenommen.\n");
speichern();
}
else
{
Ausgabe.append ("\nDas Auto ist nicht verliehen.\n");
}
}
else
{
Ausgabe.append ("\nFalsche Autonummer. Autonummer muss zwischen 0 und "+(aNr-1)+" liegen.\n");
}
}
else
{
Ausgabe.append ("\nFalsche Filialnummer. Filialnummer muss zwischen 0 und "+(firma.filZahl-1&