Objekte löschen

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

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

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.

  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 
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

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

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

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.

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

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