Serialisierung: speichern und auslesen, auslesen klappt nicht

kuzdu

Aktives Mitglied
Hallo!

Ich habe gerade in meinem Java-Buch Serialisierung durchgenommen und wollte mal ein Adressbuch schreiben. Deshalb mein Prinzip: Per Switch-case kann man zwischen drei Optionen wählen.
1) Einfügen
2) Lesen
3) Beenden

Das Serialisieren klappt auch soweit, doch nun möchte ich meine gespeicherten Daten auslesen und dabei haperts noch.

Vorweg: Bin noch Anfänger, also sorry, wenn mein Code vllt etwas kompliziert geschrieben ist.

Java:
//Main-Klasse
package adressebuch;

import java.io.*;


class Ausgabeasd implements Serializable {
    String vorname;
    
    public Ausgabeasd(String v) {
        vorname = v;
    }
       
    public String getVorname() {
        return vorname;
        }
}


//Input/Output zur Auswahl der Adressbuchoption
class Lesen {
    
    public int lesen() throws IOException {
        
    BufferedReader in = new BufferedReader(
    new InputStreamReader( System.in ) );
    String s = in.readLine();  
    int zahl = Integer.parseInt(s);
    return zahl;
    
    }
}

    

class Auswahl extends Eingabe {
//Aufruf Klasse speichern
    Speichern s = new Speichern();
    
    
    
                
    public void auswaehlen(int zahl) throws IOException {
    
        int zahlZwei;
        zahlZwei = zahl;
        switch(zahlZwei)
    {
            case 1: 
                System.out.println("Eintragen");  //Objekt serialisieren
                Ausgabeasd ag = new Ausgabeasd(s.speichern());
                
                System.out.println("Erfolgreich eingetragen, geben Sie nun wieder eine Zahl an:");
                break;

                
            case 2:
                System.out.println("Auslesen");
                ag = null;  //Steht so in meinem Buch
                try {
                    ObjectInputStream is = new ObjectInputStream(new FileInputStream("foo.ser"));
                    Ausgabeasd wiederhergestellt = (Ausgabeasd) is.readObject();

                System.out.println("asd" + wiederhergestellt.getVorname());
                }
                catch(Exception ex) {
                    ex.printStackTrace();
                }
                //Hier kommt Exceptionfehler, schildere ich weiter unten welcher
                break;  
            case 3:
                System.exit(0); break; 
            default:
                System.out.println("Wrong");
    }
    }
}

public class Adressebuch {

    public static void main(String[] args) throws IOException {
   
    
    int beenden = 0;

    Lesen l = new Lesen();
    Auswahl a = new Auswahl();    
    
    do{
    a.auswaehlen(l.lesen());
    }
    while(beenden == 0);
    
    }
}

Hier noch die Klasse speichern

Java:
package adressebuch;

import java.io.*;

//Klasse Eingabe zeige ich gleich auch noch
public class Speichern extends Eingabe implements Serializable  {

    Eingabe e = new Eingabe();
    String erfolg = "Erfolgreich eingetragen";
    
    public String speichern() throws IOException {
    
     //in Datei foo schreiben
    try {        
        FileOutputStream fs = new FileOutputStream("foo.ser");
        ObjectOutputStream os = new ObjectOutputStream(fs);
        
        //Hier wird der Vorname aus der Klasse Eingabe geholt
        os.writeObject(e.vorname());
        os.close();
        
    }
    catch (Exception ex) {
        ex.printStackTrace();
    }
   return erfolg;
    
    }
}

Nun die Klasse Eingabe

Java:
package adressebuch;

import java.io.*;

public class Eingabe {

    String vorname;
        
    
    public String vorname() throws IOException {
        
    BufferedReader in = new BufferedReader(
    new InputStreamReader( System.in ) );
    String s = in.readLine();
    vorname = s;
    
    
    return vorname;
    }
    
    public String getVorname(){
        return vorname;
    }
}

Nun zu dem Fehler: Das Eintragen funktioniert soweit, also es wurde beim ersten Mal auf jeden Fall eine foo.ser angelegt.
Wenn ich den Inhalt allerdings auslesen möchte und die Zwei drücke, dann kommt folgender Exceptionfehler:

java.lang.ClassCastException: java.lang.String cannot be cast to adressebuch.Ausgabeasd
at adressebuch.Auswahl.auswaehlen(Adressebuch.java:63)
at adressebuch.Adressebuch.main(Adressebuch.java:95)

Also ich verstehe das so, dass der String nicht in Ausgabeasd übertragen werden kann, nur hilft mir das irgendwie nicht mehr weiter. Programmiere jetzt auch schon gut eine Stunde daran und sehe vielleicht den Wald vor lauter Bäumen nicht mehr :bahnhof:. Deshalb wäre ich für einen Rat sehr dankbar. :)

Eine andere Sache ist: gehe ich das Adressbuch "richtig" an oder ist meine Art sehr kompliziert?
Und falls mein Adressbuch irgendwann funktionieren sollte, gibt es eine Möglichkeit spezielle Einträge wieder zu löschen? Wonach müsste man googeln, hatte mal gesucht, aber nichts gefunden.

Danke für eure Hilfe

Gruß
 

eRaaaa

Top Contributor
a) du serialisierst nur einen String ( os.writeObject(e.vorname()); ) vorname = String
b) probierst beim Lesen aber zu Ausgabeasd zu casten
c) wildes Durcheinander.
 

nrg

Top Contributor
du serialisierst nicht das Object vom Typ Ausgabeasd sondern nur das Attribut vorname vom Typ String. deshalb dann die ClassCastException, weil ein String kein Ausgabeasd ist

edit: zu langsam aber c) von eRaaaa kann ich ebenfalls bestätigen :D
 

kuzdu

Aktives Mitglied
Habe mir Rat c) zum Gemüte geführt und es "neu" geschrieben. Tatsächlich es funktioniert nun.

Ich stoße jetzt allerdings an ein neues Problem. Der Code funktioniert soweit, aber ich gebe meinetwegen zwei Vornamen an, diese werden auch wunderbar gespeichert. Starte ich das Programm neu, sind diese immer noch da. Füge ich dann wieder zwei neue Vornamen hinzu, sind die alten überschrieben. Aber das ist ja nicht Sinn eines Adressbuches haha :) Hat jmd. diesbezüglich eine Idee? Also wie ich diese Überschreibung verhindern kann. Morgen frage ich mal google, aber wenn jmd. schon vorher Lust hat etwas zu posten bzw. mir ein Stichpunkt geben kann, bin ich natürlich dankbar.

Eine letzte Frage noch: Gibt es eine Möglichkeit, wenn ich 5 Adressen drin habe nur eine ganz bestimmte zu löschen? Wie gehe ich da vor?

Ansonsten gute Nacht und hier mein gesamter, vollständiger und hoffentlich übersichtlicherer Code :)

Java:
//main-Klasse
package adressbuch2;
import java.io.*;

class OptionAuswahl {
    
    public int optionAuswahl() throws IOException {
    BufferedReader in = new BufferedReader(
    new InputStreamReader( System.in ) );
    String s = in.readLine();
    int auswahlNummer = Integer.parseInt(s);
    return auswahlNummer;
    }
    
}

public class Adressbuch2 {

    public static void main(String[] args) throws IOException {
    
    OptionAuswahl oa = new OptionAuswahl();
    Speichern sp = new Speichern();
    Auslesen al = new Auslesen();   
    int ende = 0;  
    
    
    System.out.println("1 = Speichern");
    System.out.println("2 = Ansehen");
    System.out.println("3 = Exit");
    
    do{
        switch(oa.optionAuswahl()) {
            case 1: System.out.println("Einlesen"); 
            sp.speichern(); 
            break;
            
            case 2: System.out.println("Auslesen"); 
            al.auslesen();
            break;
                
            case 3: System.out.println("Auf Wiedersehen!");
            System.exit(0);
            break;
            
            default: System.out.println("Falsche Eingabe");
        }
        
        
    }    
    while(ende == 0);    
    }
}

Java:
//eingabe
package adressbuch2;
import java.io.*;

class Eingabe {
    String vorname;
        
    public String vorname() throws IOException {
    BufferedReader in = new BufferedReader(
    new InputStreamReader( System.in ) );
    String s = in.readLine();
    vorname = s;
    return vorname;
    }
}

Java:
package adressbuch2;
import java.io.*;

class Personalien implements Serializable {
    
    String vorname;
    
    public Personalien(String v){
        vorname = v;
    }
    
    public String getVorname(){
        return vorname;
    }
}

Java:
package adressbuch2;
import java.io.*;


class Speichern extends Eingabe {

    
    public void speichern() throws IOException {
    
    Eingabe e = new Eingabe();
    Personalien p = new Personalien(e.vorname());    
    Personalien pZwei = new Personalien(e.vorname());
    try {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("buch.ser"));
        os.writeObject(p);
        os.writeObject(pZwei);
        
    }
    catch(IOException ex) {
        ex.printStackTrace();
    }
    
    p = null;    
    }
    
}

Java:
package adressbuch2;

import java.io.*;

class Auslesen {
    
    
    public void auslesen() {
    try {
        ObjectInputStream is = new ObjectInputStream(new FileInputStream("buch.ser"));
        Personalien wiederhergestellt = (Personalien) is.readObject();
        Personalien wiederhergestelltZwei = (Personalien) is.readObject();
        
        
        
        System.out.println("Vorname: " + wiederhergestellt.getVorname());
        System.out.println("Vorname: " + wiederhergestelltZwei.getVorname());
    }
    catch(Exception ex) {
        ex.printStackTrace();
    }
    
    }
}
 
Zuletzt bearbeitet:

nrg

Top Contributor
ich würde dir eine Datenhaltung direkt im Speicher empfehlen (z.B. eine Liste). Diese kannst du dann am Ende komplett serialisieren und somit auch einfacher Adressen löschen.
 

kuzdu

Aktives Mitglied
Habe mir Rat c) zum Gemüte geführt und es "neu" geschrieben. Tatsächlich es funktioniert nun.

Ich stoße jetzt allerdings an ein neues Problem. Der Code funktioniert soweit, aber ich gebe meinetwegen zwei Vornamen an, diese werden auch wunderbar gespeichert. Starte ich das Programm neu, sind diese immer noch da. Füge ich dann wieder zwei neue Vornamen hinzu, sind die alten überschrieben. Aber das ist ja nicht Sinn eines Adressbuches haha :) Hat jmd. diesbezüglich eine Idee? Also wie ich diese Überschreibung verhindern kann. Morgen frage ich mal google, aber wenn jmd. schon vorher Lust hat etwas zu posten bzw. mir ein Stichpunkt geben kann, bin ich natürlich dankbar.

Ansonsten gute Nacht und hier mein gesamter, vollständiger und hoffentlich übersichtlicherer Code :)
 
Zuletzt bearbeitet:

nrg

Top Contributor
hast du meinen post oben auch gelesen? :)

du sollst eine Klasse schreiben, die eine ArrayList o.ä. mit Personalien hält. Diese serialisierst du dann komplett. Damit hast du das Problem auch nicht mehr.
 

kuzdu

Aktives Mitglied
hast du meinen post oben auch gelesen? :)
Iwie drüber gelesen, sorry :)

Habe mich jetzt soweit mit ArrayList auseinandergesetzt und bin leider an einige, verschiedene Schwierigkeiten gekommen, die wohl alle miteinander zusammenhängen. :)

Ich habe das ganze jetzt in eine grafische Oberfläche verpackt. Eine Textarea, dort erscheinen die Adressen, ein Textfeld zur Eingabe und drei Buttons: Eintragen, Auslesen, Löschen.

(1) Wenn ich eintragen möchte, rufe ich die Klasse SpeicherListener auf:

Java:
class SpeicherListener implements ActionListener {
    
    public void actionPerformed(ActionEvent a) {
  
   Adresse a1 = new Adresse(textfeld.getText());
    Adresse a2 = new Adresse(textfeld.getText());
    Adresse a3 = new Adresse(textfeld.getText());
    
    
    
    if(i==1) { //i ist in meiner main class definiert mit int i = 1;
    AdressListe.add(a1);   
    text.setText("1. Adresse gespeichert");
    i++;
    }
    else if(i == 2) {
    AdressListe.add(a2);
    text.setText("2. Adresse gespeichert");
    i++;
    }
    else
    {
    AdressListe.add(a3);
    text.setText("3. Adresse gespeichert");
    }

}

}

Hier beginnt nun das erste Problem: Einmal finde ich meine Methode unheimlich statisch. Weil so können nur drei Adressen gespeichert werden. Gibt es die Möglichkeit mit der Arraylist etwas dynamisches zu erstellen? (Ich habe leider nichts gefunden)

Zur Verdeutlichung was ich meine, hier ein Pseudocode:
Schaue ob Stelle 1 in der ArrayList besetzt ist,
wenn ja, schaue eine Stelle höher und kontrolliere ob Stelle2 besetzt ist,
wenn ja, schaue eine Stelle höher....
Wenn nein, lege neue Stelle an.

Also in der Art so etwas:
Java:
int i = 0;
int ende = 0;
do
{
if(AdressListe.contains(i) == true)
i++;
else
{
AdressListe.add(a[i]); //<------ Das habe ich ausprobiert, funktioniert aber nicht :/
ende = 1;
}
while(ende == 1)


(2) Nun meine 2. Schwierigkeit
Mein Löschen sieht so aus:

Java:
class LoeschenListener implements ActionListener {
    public void actionPerformed(ActionEvent a) {
    
        if(textfeld.getText().equals("1"))
        {
        text.setText("Adresse 1 ist gelöscht");    
        AdressListe.remove(0);
        i--;
        }
        else if(textfeld.getText().equals("2"))
        {    
        text.setText("Adresse 2 ist gelöscht");    
        AdressListe.remove(1);
        i--;
        }
        else if(textfeld.getText().equals("3"))
        {   
        text.setText("Adresse 3 ist gelöscht");    
        AdressListe.remove(2);
        i--;
        }
    }
Diese Lösung funktioniert zwar zum Teil, finde ich aber ebenfalls sehr unschön. Vorallem aus dem Grund weil es zu einem Fehler kommt, wenn ich den Befehl zum Löschen der Adresse 3 gebe und keine Adresse 3 existiert.

Meine Alternative wäre wieder zu schauen, ob die angewählte Adresse, überhaupt einen Inhalt hat: Also if(AdressListe.contains(textfeld.getText()) == true)
dann löschen.

Das Problem, welches hier auftritt: Die AdressListe.contains(0) ist immer false, auch wenn eindeutig Inhalt in der Liste ist. Habe gegoogelt und habe sogar hier im Forum ein ähnliches Problem gefunden, wo das Adresse a1 = new Adresse(textfeld.getText()); immer neu erstellt wird und deshalb immer leer ist.
Ich vermute, dass die Klasse LoeschenListener nicht auf die "richtige"(?) Arraylist zugreift und deshalb auch keinen Wert findet.
Deshalb habe ich die Arraylist mal in meiner main class erstellt:

Java:
public class AdressbuchGui {
   
    JTextArea text;
    JTextField textfeld;
    JButton eintragen;
    JButton auslesen;
    JButton loeschen;
    ArrayList<Adresse> AdressListe = new ArrayList<Adresse>();
    Adresse a1 = new Adresse("asd");
//    Adresse a1 = new Adresse(textfeld.getText()); <--- NullPointerException

Hier stoße ich nun allerdings an ein weiteres Problem: Einmal ist die Adresse a1 in dem LoeschenListener immer noch false und das zweite ist, dass ich nun eine NullPointerException bekomme, da anscheinend das Textfeld aufgerufen wird, bevor es einen Wert hat.

Ich habe nun rumprobiert, doch komme auf keinen grünen Zweig. Wo genau muss ich die ArrayList erstellen, dass alle Klassen gut darauf zugreifen und wie unterbinde ich die NullPointerException? Gibt es eine Möglichkeit die Adresse dynamisch zu erstellen?

Ich hoffe meine Problem sind einigermaßen verständlich, wenn ihr noch mehr Code braucht oder spezifirische Auskünfte benötigt, gebe ich gerne :)

Danke für Hilfe


PS: Ich weiß, dass das zurzeit gar nichts mehr mit serialisieren zu tun hat, aber ich wollte nicht extra einen neuen Thread erstellen ;)
 
S

SlaterB

Gast
> und wie unterbinde ich die NullPointerException?
versuche doch, nur sinnvolle Fragen zu stellen, es geht doch nicht ums Unterbinden, sondern
> Adresse a1 = new Adresse(textfeld.getText());
ist an der Stelle sowieso falsch, selbst ohne Exception unnötig, was hast du dort vor? ein Text wird dort noch nicht drinstehen

------

arbeite mit der size() der Liste statt mit Index,
bzw. beim add() kannst du einfach das neue Objekt anfügen, musst überhaupt nichts nachschauen, jedenfalls nichts mit i,

bei remove() kannst du ja evtl. den letzten Index in der Liste aus size() berechnen

------

contains auf eine Liste mit Adress-Objekten funktioniert logischerweise nur mit auch einem Adress-Objekt, weder mit '0' was immer das sein soll,
noch mit einem String,
damit Adress gefunden wird, muss allerdings die equals-Methode implementiert sein
(wahrscheinlich kommt gleich die Frage 'ich weiß nix, alles noch viel haarkleiner erklären', ich belasse es aber erstmal dabei,
und hoffe mit diesem Hinweis irgendeine Art von Denktätigkeit im Gehirn anzustoßen, es gibt Lehrbücher, Internet-Tutorials usw...)

Galileo Computing :: Java ist auch eine Insel - 8 Besondere Klassen der Java SE
8.3.3 Objektgleichheit mit equals() und Identität

Galileo Computing :: Java ist auch eine Insel - 13 Einführung in Datenstrukturen und Algorithmen
13.4.3 Über die Bedeutung von equals() und hashCode()


(edit: wenn HashSet, dann nicht nur equals(), sondern eben auch hashCode() wichtig)
 
Zuletzt bearbeitet von einem Moderator:

HimBromBeere

Top Contributor
Du willst doppelte Werte vermeiden, ist das richtig? Sollte dem so sein, warum nimmst du nicht einfach eine HashSet, welches keine doppelten Einträge zulässt.
 

kuzdu

Aktives Mitglied
> und wie unterbinde ich die NullPointerException?
versuche doch, nur sinnvolle Fragen zu stellen, es geht doch nicht ums Unterbinden, sondern
> Adresse a1 = new Adresse(textfeld.getText());
ist an der Stelle sowieso falsch, selbst ohne Exception unnötig, was hast du dort vor? ein Text wird dort noch nicht drinstehen

Also das wäre ja meine Frage gewesen, wo die Adresse a1 usw.. richtig wäre. Weil es ergibt sich folgendes Problem bei mir:

Die Klasse Adresse fordert einen String
Java:
class Adresse {
    
    String vorname;
    
    Adresse(String vorname) {
        this.vorname = vorname;
    }
}

Also fordert der Compiler hier in den Klammern einen Wert: Adresse a1 = new Adresse("hier der Wert");
Da ich diesen Wert ja eign. für mein Adressbuch bestimmen will, habe ich das textfeld.getText() eingefügt. Dieses führt allerdings in der main class zu einer Exception.

Wenn ich die Adresse a1 = new Adresse(textfeld.getText()); in meiner Klasse SpeicherListener lasse, dann kann ich mit der Klasse LoeschenListener nicht auf a1 zugreifen. Da liegt also mein Problem.

arbeite mit der size() der Liste statt mit Index,
bzw. beim add() kannst du einfach das neue Objekt anfügen, musst überhaupt nichts nachschauen, jedenfalls nichts mit i,

Wenn ich das i weggelasse, überschreibt der in meinem immer den ersten Wert. Deshalb das i. Aber size ist eine gute Idee, werde ich mal ausprobieren. Danke.


bei remove() kannst du ja evtl. den letzten Index in der Liste aus size() berechnen


contains auf eine Liste mit Adress-Objekten funktioniert logischerweise nur mit auch einem Adress-Objekt, weder mit '0' was immer das sein soll,
noch mit einem String,
damit Adress gefunden wird, muss allerdings die equals-Methode implementiert sein

Das 0 sollte sich eing. auf den ersten Wert im Array beziehen. Habe es mit remove(a1) ausprobiert und es funktioniert. Allerdings nur wenn Adresse a1 = new... in der main class definiert ist.

Die equals Methode ist doch implementiert oder meinst du etwas anderes?
Ich gebe eine "1" ins textfeld und der Vergleich wird mit textfeld.getText().equals("1") gemacht. Das einzige Blöde daran war, dass wenn kein Wert drin stand und ich eine 1 eingeben habe. Hat der remove(0) gemacht, was zu einem Fehler geführt hat. Das wurde aber durch remove(a1) behoben. Habe es gerade ausprobiert.


(wahrscheinlich kommt gleich die Frage 'ich weiß nix, alles noch viel haarkleiner erklären', ich belasse es aber erstmal dabei,
und hoffe mit diesem Hinweis irgendeine Art von Denktätigkeit im Gehirn anzustoßen, es gibt Lehrbücher, Internet-Tutorials usw...)

Ich hoffe doch nicht, dass das so rüberkommt! Will es ja lernen und muss es auch nicht für iwas machen, nur so, weil ich es kann (bzw. noch nicht kann) :)

Galileo Computing :: Java ist auch eine Insel - 8 Besondere Klassen der Java SE
8.3.3 Objektgleichheit mit equals() und Identität

Galileo Computing :: Java ist auch eine Insel - 13 Einführung in Datenstrukturen und Algorithmen
13.4.3 Über die Bedeutung von equals() und hashCode()


(edit: wenn HashSet, dann nicht nur equals(), sondern eben auch hashCode() wichtig)
Das werde ich mir mal anschauen.
Von HashSet habe ich nun wiederrum noch gar nichts gehört, deshalb muss ich mich da erst reinlesen.
Vielen Dank für die Hilfe schon einmal


Du willst doppelte Werte vermeiden, ist das richtig? Sollte dem so sein, warum nimmst du nicht einfach eine HashSet, welches keine doppelten Einträge zulässt.

Nein, doppelte Einträge will ich (noch) nicht verhindern.
Also das Hauptproblem ist, dass ich nicht genau weiß, wo ich Adresse a1 = new Adress usw... anlegen muss, damit ich meine Werte aus dem Textfeld eingeben kann und meine beiden Listener Speicher und Loeschen drauf zugreifen können.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> Also fordert der Compiler hier in den Klammern einen Wert: Adresse a1 = new Adresse("hier der Wert");

dieser Wert muss aber im Fall der Fälle doch nicht aus einem Textfeld kommen, gibt auch "" als Dummy-Leerstring



wenn du einen Listener hast der eine Aktion ausführt, dann sollten im Zweifel auch genau dort die Befehle hin,
was spricht dagegen? hast du vielleicht schon geschrieben, geht in der Masse dann etwas unter

edit:
> Wenn ich die Adresse a1 = new Adresse(textfeld.getText()); in meiner Klasse SpeicherListener lasse,
> dann kann ich mit der Klasse LoeschenListener nicht auf a1 zugreifen. Da liegt also mein Problem.

in jedem Listener diese Zeile neu schreiben, das ist im Moment vertretbarer Aufwand

--------

> Die equals Methode ist doch implementiert oder meinst du etwas anderes?
> Ich gebe eine "1" ins textfeld und der Vergleich wird mit textfeld.getText().equals("1") gemacht.

dass diese drei Adresse-Objekte mit 3x if fragwürdig sind hast du ja schon selber erkannt, der Code kann weg,

es geht um das equals in einer Klasse, eine Methode, alles nachzulesen,
damit contains() funktioniert

ein Testprogramm a la
Java:
public class Test
{
    public static void main(String[] args)
    {
        Adresse a1 = new Adresse("xy");
        Adresse a2 = new Adresse("xy");
        list.add(a1);
        System.out.println(list.contains(a2));
    }
}
mit restlichen Ergänzungen muss laufen, vorher wirds schwer in der Liste Adressen zu suchen,
falls das weiterhin ein benötigter Punkt ist
 
Zuletzt bearbeitet von einem Moderator:

kuzdu

Aktives Mitglied
Danke, bin jetzt schon ein Stück weitergekommen, doch eine Sache ist sehr seltsam.

Das AdressListe.remove(a1) funktioniert nur, wenn wirklich nur ein Element in der Liste eingetragen ist. Trage ich zwei Elemente in die Liste ein, funktioniert AdressListe.remove(a1) nicht mehr. Allerdings lässt sich dann das 2. Element löschen, mit AdressListe.remove(a2).

Es lässt sich also immer nur das letzte Element löschen.

Mein Code sieht inzwischen so aus:
Java:
public class AdressbuchGui {
    Adresse a1 = new Adresse("");
    Adresse a2 = new Adresse("");
....

class SpeichernListener implements ActionListener {
    
    public void actionPerformed(ActionEvent a) {
  
    a1 = new Adresse(textfeld.getText());
    a2 = new Adresse(textfeld.getText());
 
    if(AdressListe.size() == 0) {
    AdressListe.add(a1);   
    }
    else if(AdressListe.size() == 1) {
    AdressListe.add(a2);    
     }
  }
}

class LoeschenListener implements ActionListener {
    public void actionPerformed(ActionEvent a) {
     
        AdressListe.remove(a1);
       
        }
    }
}




Edit:
@SlaterB
wenn du einen Listener hast der eine Aktion ausführt, dann sollten im Zweifel auch genau dort die Befehle hin,
was spricht dagegen? hast du vielleicht schon geschrieben, geht in der Masse dann etwas unter

edit:
> Wenn ich die Adresse a1 = new Adresse(textfeld.getText()); in meiner Klasse SpeicherListener lasse,
> dann kann ich mit der Klasse LoeschenListener nicht auf a1 zugreifen. Da liegt also mein Problem.

in jedem Listener diese Zeile neu schreiben, das ist im Moment vertretbarer Aufwand

Also wenn ich im in den beiden Listenern die Elemente neu deklariere, dann kriege ich sie nicht gelöscht, weil in meinem Code (wie ich vermute) die Verknüpfung zum Anderen fehlt.
Deshalb deklariere ich sie in der main classe.

Java:
class MeinLoeschenListener implements ActionListener {
    public void actionPerformed(ActionEvent a) {

 a1 = new Adresse(textfeld.getText());
    AdressListe.remove(a1);
}

}

Oder welche Zeile meinst du?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> dann kriege ich sie nicht gelöscht, weil in meinem Code (wie ich vermute) die Verknüpfung zum Anderen fehlt.

mit richtigen equals() brauchst du keine Verknüpfung, solange das fehlt kann in der Tat nicht viel funktionieren,
- siehe meine Links
- siehe vor allem mein Beispielprogramm im letzten Post..
 

vimar

Bekanntes Mitglied
Hier mal meine "version" zum ein und auslesen eines oder mehrerer objekte. gespeichert wird in einer xml datei. (anstatt der normalen speicherung (als .ser)). (ist auch in java ist auch eine insel). finde ich am einfachsten.

hier muss man garnicht viel "verstehen", nur wissen an welcher stelle man das/die Objekt/Objekte "einfügt".

Einfach diese beiden methoden in der gewünschten klasse einfügen.

in Zeile 12 das Objekt was man speichern will einfügen.
in zeile 41 sieht man wie das objekt wieder eingelesen wird + man muss darauf achten, weil es sich beim einlesen(in diesem fall) um den Typ "Object" handelt dass man auch noch eine typenumwandlung macht (in meinem fall war das eine mehrfach geschachtelte arraylist). stattdessen kann da aber auch (String) stehten falls es sich bei dem objekt um einen String handelt.


Java:
public void writeSiftDB(){
        
      
        
        
        XMLEncoder enc = null;
         
          try 
    { 
      enc = new XMLEncoder( new FileOutputStream(filename) ); 
      System.out.println("wird nun gespeichert!");
      enc.writeObject( ImageList ); 
      System.out.println("fertig mit speichern!");
    } 
    catch ( IOException e ) { 
      System.out.println("nicht gespeichert!");
        e.printStackTrace(); 
      
    } 
    finally { 
      if ( enc != null ) {
        enc.close();
        System.out.println("gespeichert!");
      }
       
    } 
        
    }
    
    public void loadSiftDB(){
        
        
        // Deserialize() 
 
    XMLDecoder dec = null; 
 
    try 
    { 
      dec = new XMLDecoder( new FileInputStream(filename) ); 
 
      ImageList = (ArrayList <ArrayList <ArrayList <Object>>>) dec.readObject(); 
     
 
      System.out.println( "Object geladen!"); 
 
      
    } 
    catch ( IOException e ) { 
        System.out.println("Fehler beim laden des objects!");
      e.printStackTrace(); 
    } 
    finally { 
      if ( dec != null ) 
        dec.close(); 
    } 
  }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Std-Serialisierung - Speichern/Laden geht nur auf einem Rechner Java Basics - Anfänger-Themen 17
A Per Serialisierung speichern Java Basics - Anfänger-Themen 2
P Collection Vector speichern mittels Serialisierung? Java Basics - Anfänger-Themen 2
D Problem mit der Serialisierung Java Basics - Anfänger-Themen 31
M Serialisierung in Java Java Basics - Anfänger-Themen 10
S Serialisierung: Laden von Objekten - Risiken? Java Basics - Anfänger-Themen 4
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
I Input/Output Alternative zur Serialisierung/ ImageJ Objecte Java Basics - Anfänger-Themen 7
W Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc. Java Basics - Anfänger-Themen 2
V Java Serialisierung Java Basics - Anfänger-Themen 2
O Objekt Listen serialisierung und deserialisieren Java Basics - Anfänger-Themen 5
U Serialisierung Probleme bei Umsetzung Java Basics - Anfänger-Themen 26
V Serialisierung Umbennung einer Klasse Java Basics - Anfänger-Themen 2
G Input/Output Serialisierung oder Datenbank Java Basics - Anfänger-Themen 6
K Input/Output Serialisierung Java Basics - Anfänger-Themen 7
P Serialisierung - Objekte vergleichen Java Basics - Anfänger-Themen 4
J Input/Output Serialisierung Java Basics - Anfänger-Themen 6
W Problem mit Serialisierung von jTable Java Basics - Anfänger-Themen 15
E Serialisierung - Exception? Java Basics - Anfänger-Themen 21
T Collections (De)-Serialisierung meines HashSets Java Basics - Anfänger-Themen 3
J Input/Output Serialisierung Java Basics - Anfänger-Themen 6
W Problem mit Serialisierung und TableModel Java Basics - Anfänger-Themen 3
F Sonderzeichen bei XML Serialisierung nicht konvertieren Java Basics - Anfänger-Themen 7
O Serialisierung: Object abspeichern und aufrufen Java Basics - Anfänger-Themen 6
L Java Serialisierung Singleton Java Basics - Anfänger-Themen 6
Luk10 Serialisierung bei schon vorhandener Datei Java Basics - Anfänger-Themen 15
I Serialisierung ClassNotFound Java Basics - Anfänger-Themen 8
S serialisierung Java Basics - Anfänger-Themen 3
E Alternativen zur binären Serialisierung ? Java Basics - Anfänger-Themen 9
J Serialisierung - Array-Objekt serialisieren/deserialisieren Java Basics - Anfänger-Themen 6
G Frage zu Serialisierung Java Basics - Anfänger-Themen 4
M Serialisierung erstes Beispiel Java Basics - Anfänger-Themen 4
DStrohma Problem mit Serialisierung Java Basics - Anfänger-Themen 3
T Threads und Serialisierung Java Basics - Anfänger-Themen 4
Z Serialisierung vs. Sicherheit Java Basics - Anfänger-Themen 2
R Serialisierung von Objekten Java Basics - Anfänger-Themen 12
S Serialisierung Java Basics - Anfänger-Themen 8
G Objekt Serialisierung Java Basics - Anfänger-Themen 3
P Serializable - Serialisierung Java Basics - Anfänger-Themen 5
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
J Objekte in JSON speichern?? Java Basics - Anfänger-Themen 1
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
I Objekte in ShareProject speichern um später zu nutzen Java Basics - Anfänger-Themen 4
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
I Datei (Bild) Drucken und wie Druckeinstellung speichern? Java Basics - Anfänger-Themen 3
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
M Werte in Felder speichern und geordnet ausgeben Java Basics - Anfänger-Themen 8
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Permanentes speichern von Objekten in einer ArrayList Java Basics - Anfänger-Themen 6
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
I Historisierung - Alter Wert, Neuer Wert... wie speichern? Java Basics - Anfänger-Themen 44
berserkerdq2 Wie datum im default format speichern? Java Basics - Anfänger-Themen 5
M Objekt in einem Objekt speichern Java Basics - Anfänger-Themen 9
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
U Wie ein Attribut von einer Klassenmethode in der Klasse speichern= Java Basics - Anfänger-Themen 2
B Screenshots machen und zwar viele und speichern Java Basics - Anfänger-Themen 12
C XML Datei speichern und laden Java Basics - Anfänger-Themen 18
Marlena Bauer Konsolenausgabe in .txt speichern Java Basics - Anfänger-Themen 6
B JaxB - Property vom Typ Object und LocalDateTime speichern? Java Basics - Anfänger-Themen 0
ansystin Teilerfremde Zahlen ausgeben + Zahlenausgabe speichern Java Basics - Anfänger-Themen 3
J Wert in einer json Datei ändern und speichern Java Basics - Anfänger-Themen 3
C File speichern Java Basics - Anfänger-Themen 5
D String und char in String speichern Java Basics - Anfänger-Themen 5
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
I Werte (u.a. Geldbeträge) in Datenbank speichern und Rundungen? Java Basics - Anfänger-Themen 8
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
B JaxB - speichern vom Typ "Object" Java Basics - Anfänger-Themen 8
GermanPie Nachrichten Speichern Java Basics - Anfänger-Themen 2
M Objekte in Array speichern und ausgeben Java Basics - Anfänger-Themen 17
C Wo Defaultpfad speichern? Java Basics - Anfänger-Themen 2
M Integer aus aus einer Klasse in andere speichern Java Basics - Anfänger-Themen 12
Dimax stream in string[] speichern Java Basics - Anfänger-Themen 6
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
C Fehler beim Speichern (Build projekt) Java Basics - Anfänger-Themen 42
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
D Input/Output Input von zwei Koordinaten validieren und anschließend Werte speichern Java Basics - Anfänger-Themen 7
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
I ArrayList - Methode zum Speichern eines Eintrags in einer Datei Java Basics - Anfänger-Themen 17
H Objekt im Array speichern Java Basics - Anfänger-Themen 2
H Objekt als Attribut speichern Java Basics - Anfänger-Themen 11
B Text-Datei nur in Stream speichern und dann ausgeben Java Basics - Anfänger-Themen 3
M JTextField in ArrayList speichern Java Basics - Anfänger-Themen 4
L Nur Bestimmte Werte aus einem Array in ein anderes Speichern Java Basics - Anfänger-Themen 11
S Zweidimensionales Array in ein eindimensionales Array speichern Java Basics - Anfänger-Themen 6
A Wie zwei zahlen in einer Variable speichern? Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben