Objekte löschen

Von: , Frage gestellt am Do, 6. Mai 2004

Hallo,

wir haben während der Java Vorlesung eine kleine Bankkontenverwaltung als Übung programmiert.

Bei "Konto anlegen" wird ein Objekt der Klasse Konto erzeugt.

Als Referenz für die Konten wird die Klassenvariable KontoListe[] verwendet.

Diese Konten sollen jetzt natürlich auch wieder gelöscht werden können.

Dazu muss lediglich die Referenz gelöscht werden, richtig?

KontoListe[3] = null;

Damit jetzt keine Lücken in der Kontoliste entstehen müssen alle nachfolgenden Indizes um 1 reduziert werden.

Stimmt mein Ansatz theoretisch? (bzgl. des löschens der Konten und dem Update der Kontoliste, siehe unten)

Danke!



//Funktion zum löschen eines Kontos
public boolean konto_loeschen (int kontonummer)
{
...int i = 0;
...// Schleife über alle Konten
...for(i=1; i<=AnzahlKonten; i++)
...{
......// Vergleich der zu löschenden Kontonummer mit aktueller Kontonummer in der Schleife
......if(kontonummer==KontoListe[i].KTONR)
......{
.........int j = 0;
.........// Referenz löschen und Update der KontoListe
.........for(j=i; j<=AnzahlKonten-1; j++)
.........{
............Kontoliste[j] = KontoListe[j+1];
.........}
.........//Nachdem die Kontoliste aktuelisiert wurde kann die erste Schleife abgebrochen werden
.........break;
......}
...}
...return true;
}

7 Antworten zu dieser Frage

  1. Antwort von nach 36 Minuten 0 hilfreich
    Re: Objekte löschen

    Du koenntest das ganze auch in einer Collection (z.B. ArrayList oder
    LinkedList) verwalten.
    Dann brauchst du dir keine Gedanken um die Indices machen.
    Einfach remove(Object) aufrufen und fertig.

    Gruss, Patrick

    • Antwort von nach 4 Stunden 0 hilfreich
      Re^2: Objekte löschen

      Hallo Patrick,

      danke für die schnelle Antwort.

      leider bin ich blutiger Anfänger. Die einzigen Container die wir bisher verwendet haben sind Arrays.

      Die Vorgehensweise mit dem Update der Indices wurde uns von unserem Prof so vorgegeben.

      Desweiteren habe ich immer noch einige Verständnissprobleme was Objekte, Klassen, Instanzen oder Referenzen angeht.

      1. Löschen von Objekten
      Um ein Objekt zu löschen muss ich nur die Referenz löschen bzw. überschreiben, oder?

      2. Das Compilieren des Quellcodes funktioniert bei der geposteten Funktion ohne Fehler oder Warnungen. Das Objekt wird auch gelöscht. Zumindest kommt die Meldung "Konto nicht vorhanden" wenn ich "Kontoauszug" auswähle.

      Allerdings gibt es dann beim anlegen eines neuen Kontos einen Programmfehler. (Meldung weiss ich jetzt nicht)

      Könntest du mal bitte einen Blick auf meine Funktion werfen?

      Danke.

      • Antwort von nach 5 Stunden 1 hilfreich
        Re^3: Objekte löschen

        1. Löschen von Objekten
        Um ein Objekt zu löschen muss ich nur die Referenz löschen
        bzw. überschreiben, oder?
        Wenn du einem Objekt null zuweist, ist die Referenz geloescht, aber
        das Objekt verbleibt dann trotzdem noch im Speicher der VM. Der
        Garbage Collector gibt dann zu gegebener Zeit den Speicher frei. Allerdings gibt es dann beim anlegen eines neuen Kontos einen
        Programmfehler. (Meldung weiss ich jetzt nicht)
        ArrayOutOfBoundsException. Das Thema Exception habt ihr
        doch schon angerissenm, oder?

        Na, jedenfalls musst du mit den Indices aufpassen. Dein Feld hat
        Indices von 0 bis KontoListe.length-1. Könntest du mal bitte einen Blick auf meine Funktion werfen?
        Die for-Schleifen habe ich etwas angepasst. Da die Funktion
        einen boolean zurueckgibt, solltest du auch je einen der Werte
        (true/false) zurueckgeben. Wenn du nur true zurueckgibst, denkt
        der Benutzer immer, dass es geklappt hat.

        public static boolean konto_loeschen(String kontonummer) {
        for (int i = 0; i < KontoListe.length; i++) {
        if (kontonummer == KontoListe[i]) {
        for (int j = i; j < KontoListe.length - 1; j++) {
        KontoListe[j] = KontoListe[j + 1];
        }
        // fertig
        return true;
        }
        }
        // keine Uebereinstimmung
        return false;
        }

        Da musst du aber nochmal ueberlegen. Ich kenne die genauen
        Massgaben ja nicht. Z.B. soll das Array dann auch verkleinert
        werden.
        In deinem Beispiel wuerde das dann naemlich so aussehen:
        (ich habe es mal mit einem reinen String Array getestet)
        vorher:  111, 222, 333, 444, 555, 666
        loesche 222
        nachher: 111, 333, 444, 555, 666, 666
        

        Gruss, Patrick

        • Antwort von nach 7 Stunden 1 hilfreich
          Re^4: Objekte löschen

          ArrayOutOfBoundsException. Das Thema Exception habt ihr
          doch schon angerissenm, oder?
          Ja, ich glaub das wars.

          Wir haben "gelernt" das es Exceptions gibt und wozu sie da sind, aber noch nicht angewendet (kommt noch). Die for-Schleifen habe ich etwas angepasst. Da die Funktion
          einen boolean zurueckgibt, solltest du auch je einen der Werte
          (true/false) zurueckgeben. Wenn du nur true zurueckgibst,
          denkt der Benutzer immer, dass es geklappt hat.
          Ist einleuchtend. Eigentlich wollte ich das auch so machen. Aber ich war mir dann nicht sicher wo ich die return Anweisungen platzieren muss.

          Die Änderungen an der for Schleife sind klar.

          Wieso hast du für den zu übergebenden Parameter string und nicht int verwendet? Die Kontonummer kann doch nur eine natürliche Zahl sein.

          public static boolean konto_loeschen(String kontonummer) {
          for (int i = 0; i < KontoListe.length; i++) {
          if (kontonummer == KontoListe[i]) {
          for (int j = i; j < KontoListe.length - 1;
          j++) {
          KontoListe[j] = KontoListe[j + 1];
          }
          KontoListe[KontoListe.length]=null;
          :                // fertig
          :                return true;
          :            }
          :        }
          :        // keine Uebereinstimmung
          :        return false;
          :    }


          kontonummer == KontoListe[i]
          Fehlt hier nicht noch das ".KTONR"? Woher weiss Java, dass ich an der stelle die KontoNummer will. Könnte ja auch der Kontostand gemeint sein? Da musst du aber nochmal ueberlegen. Ich kenne die genauen
          Massgaben ja nicht. Z.B. soll das Array dann auch verkleinert
          werden.
          In deinem Beispiel wuerde das dann naemlich so aussehen:
          (ich habe es mal mit einem reinen String Array getestet)
          vorher:  111, 222, 333, 444, 555, 666
          loesche 222
          nachher: 111, 333, 444, 555, 666, 666
          

          Du hast vollkommen recht. Da muss ich dann das letzte Element des Arrays noch löschen. (siehe Funktion, oben)

          mfg Christian

          PS: Wie kann ich hier im Forum z.B. bei Funktionen den Text einrücken? Bei mir wird immer alles ganz nach links geschoben.

          • Antwort von nach 8 Stunden 0 hilfreich
            Re^5: Objekte löschen

            Wieso hast du für den zu übergebenden Parameter string und
            nicht int verwendet? Die Kontonummer kann doch nur eine
            natürliche Zahl sein.
            Da ich deine Klasse "Konto" (oder so) nicht kenne, habe ich es mit
            einem einfach String Array getestet.
            String[] KontoListe = {"111", "222", "333" };
            Du musst den von mir geposteten Code wieder an deine Belange
            anpassen. Habe ich vergessen. KontoListe[KontoListe.length]=null;
            Musst du denn die Liste neu "ordnen"? Reicht es nicht
            das entsprechende Element "auszunullen" und dann bei
            der Abfrage immer zu pruefen, ob das Object null ist?

            if (KontoListe[i] != null) {
            mach dies
            } else {
            mach das
            }
            

            Du muesstest dann vor dem vergleich "kontonummer == KontoListe[i].KTNR"
            eben die obige if-Abfrage einfuegen und koenntest dir zumindest
            schonmal die innere for-Schleife sparen. Fehlt hier nicht noch das ".KTONR"? Woher weiss Java, dass ich
            an der stelle die KontoNummer will. Könnte ja auch der
            Kontostand gemeint sein?
            Siehe oben. (...kenne deine Klasse Konto nicht...) Du hast vollkommen recht. Da muss ich dann das letzte Element
            des Arrays noch löschen. (siehe Funktion, oben)
            Das machst du ja schon (oben). Damit veraenderst du die Laenge
            des Arrays nicht. Lediglich ist jetzt das letzte Element in dem
            Array null. So gesehen koennte doch auch ein Element irgendwo in
            dem Array null sein. (siehe mein Vorschlag oben mit dem if) PS: Wie kann ich hier im Forum z.B. bei Funktionen den Text
            einrücken? Bei mir wird immer alles ganz nach links geschoben.
            Mit dem "ganz nach links" kann ich nicht nachvollziehnen, aber
            mit den pre-Tags kannst du prima Quellcode lesbar machen/belassen.
            (Siehe auch Link "Hilfe zur Anwendung der HTML-Tags" unter
            dem Artikel-Eingabefenster)

            Gruss, Patrick

      • Antwort von nach 6 Stunden 1 hilfreich
        Re^3: Objekte löschen

        Desweiteren habe ich immer noch einige Verständnissprobleme
        was Objekte, Klassen, Instanzen oder Referenzen angeht.
        Zwar nix zum aktuellen Problem, aber ich versuchs mal gaaaaanz kurz mit Beispiel:

        Klassen: Beschreibung von etwas.
        "Ein Auto hat einige Räder und eine Farbe (Variablen) und es kann fahren (Methode)"

        Instanz: Ein konkretes Ding, was in der Klasse beschrieben wurde
        "Mein Golf, hat 4 Räder, ist blau. er fährt"

        Referenz: Ein "Zeiger" auf ein konkretes Ding (Instanz)
        "Hier ist ein Parkplatz. Auf DEM Platz da steht dem Micha sein Auto"

        Objekt: Hmmm, so der Begriff für fast alles. Je nach Kontext meint man mit Objekt aber meist eine Instanz (manchmal aber auch ne Klasse). Deswegen den Begriff nicht so häufig benutzen.

        Michael

        • Antwort von nach 8 Stunden 0 hilfreich
          Re^4: Klassen, Objekte, Referenzen

          Hi Michael,

          Danke für deine Erläuterungen, aber die Theorie ist mir schon soweit klar.

          Zu leichten Verwirrungen kommt es z.B. in der Vorlesung. Wenn was erklärt wird und dabei diese Begriffe verwendet werden muss ich immer erst kurz überlegen. (was war das noch gleich, wie ist das jetzt in diesem Kontext zu verstehen)

          Und das dauert im Moment einfach noch zu lange. Bis ich mir im Klaren darüber bin was da gerade erklärt wurde ist der Prof schon eine Station weiter.

          Meistens läufts so, dass wir eine neue Funktion für unsere Kontoverwaltung auf dem Beamer präsentiert bekommen. Diese wird dann Zeile für Zeile durchgegangen.

          Da versteh ich dann schon noch alles. Doch wenn ich dann ne Aufgabe lösen muss und vorm Rechner sitze gehts dann los )-:

          Ich befürchte fast das da in den nächsten Wochen noch die ein oder andere Frage auf euch zukommen wird.

          Deshalb schon mal ein Danke im voraus.

          mfg. Christian

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!