Java Objekte = null, Garbagecollector

J-4a616e

Mitglied
Hallo,

ich habe folgendes Problem und habe im Internet auch keine funktionierende Lösung gefunden:

Ich habe ein Form-Objekt erzeugt und will dies nun im Verlauf des Programmes an einer bestimmten Stelle "zerstören", heißt dieses Objekt soll nicht mehr Zugreifbar sein, da dort nur temporäre Daten drauf sind. Nun habe ich das Objekt schon fest auf null gesetzt, aber aus irgendeinem Grund sind Werte, die in dem Form, in Textboxen stehen, immernoch abfragbar, was ja nicht sein dürfte. Ich habe natürlich auf Programmfluss geachtet und bin dies auch öfters durchgegangen, dort passt auch alles. Ich hatte mich schon über den Garbage Collector informiert und darauf gehofft das dieser die Ganze Sache übernimmt und sich das Objekt krallt, was er leider nicht tut. Zudem ist es ja besser, wenn man den Garbage Collector nicht händisch aufruft da dieser sich ja selber einschalten sollte, soweit ich weiß. Nun bin ich langsam echt am verzweifeln, wie ich das Object dazu bekomme nicht mehr zu existieren und ich nicht mehr auf die Daten zugreifen kann. (Der nullpointer der rauskommen sollte, wenn man das Objekt abfragt, nachdem man es auf null gesetzt hat, kommt auch nicht hervor).
Hoffe es geht ohne dazugehörigen Code, falls nicht, einfach bescheid geben dann werde ich nochmal etwas davon posten.
 
Moin,
Ich habe ein Form-Objekt erzeugt und will dies nun im Verlauf des Programmes an einer bestimmten Stelle "zerstören", heißt dieses Objekt soll nicht mehr Zugreifbar sein
Der GC wird Dein Objekt nur dann freigeben, wenn keine Referenz darauf mehr existiert!
Ob es noch Zugriffe gibt, hängt bspw. auch vom Scope des Objekts ab!

Poste mal den Code, vlt. wird dann klarer, was Du wo machst ...

VG Klaus
 
Du musst jede (aktive) Referenz auf das gewünschte Objekt entfernen, erst dann wird sich der GC dazu durchringen das Objekt auch wegzuräumen.
Wie schaffst du es denn diese Werte von den Textboxen abzufragen? Dazu brauchst du doch eine Referenz auf diese Textboxen und diese werden als Parent wahrscheinlich das Form Objekt haben 😉
 
Moin,

Der GC wird Dein Objekt nur dann freigeben, wenn keine Referenz darauf mehr existiert!
Ob es noch Zugriffe gibt, hängt bspw. auch vom Scope des Objekts ab!

VG Klaus

Habe es mittlerweile dank deinem kleinen Tipp herausgefunden. Ich hatte sich das Objekt selber, in der eigenen Klasse, null setzen lassen, was ja garnicht geht da der Code des Objektes noch nicht komplett durchlaufen ist und es somit ja noch existiert. Ist evtl bisschen verwirrend was ich grad geschrieben habe aber jetzt funktioniert alles wie es soll.
 
Moin,

Ich hatte sich das Objekt selber, in der eigenen Klasse, null setzen lassen, was ja garnicht geht da der Code des Objektes noch nicht komplett durchlaufen ist und es somit ja noch existiert.
Bitte was ??? 😱

Ist evtl bisschen verwirrend was ich grad geschrieben habe
Auf jden Fall 😛

aber jetzt funktioniert alles wie es soll
Prima 😉

VG Klaus
 
Ich versuchs nochmal zu erklären 😀. Also das Objekt(eine Login Form) , das null gesetzt werden soll, wird durch einen Button, im gleichen Objekt(in der Gui) gesteuert. Drückt man den dem Button wird eine Funktion ausgeführt die das Objekt(Login Form) null setzt. Aber da der Code der Funktion ja noch nicht vollständig zuende glaufen bzw. abgeschlossen ist und das Objekt schon = null ist hats da gekracht.
Letztenendes habe ich dann das = null setzen ausgelagert in das Objekt( Main Form)in der dann die Arbeitsoberfläche erzeugt wird.
Hoffe es ist jetzt verständlicher geworden.
Und vielen Dank nochmal 🙂
 
null setzen in Java ist meistens sowieso Unsinn. Die Objekte werden selber freigegeben, wenn sie nicht mehr benötigt werden. Der GC braucht da keine Hinweise.
 
Indem sie (die Referenzen) nicht mehr im aktuellen Scope sind. Bei "sauberer" Entwicklung fallen Objekte die nicht mehr benötigt werden aus dem Scope und können aufgeräumt werden. Selten ist es mal nötig irgendetwas mit grossem Scope (z.b. Attribute eines Singleton) zu nullen...

Aber ja, rein technisch gesehen war meine Aussage zu ungenau...
 
In dem du sie null setzt, ich habe nicht gesagt, dass das Vorgehen ist falsch. Es ist nur meistens Unsinn ein Attribut plötzlich auf null zu setzen, nur um den Speicher freizugeben.
 
Aehm und wie erkläre ich einer Instanzvariablen die eine Referenz auf ein Object hält, dass Ihr Inhalt nicht mehr länger benötigt wird?
Wie oft nullst du Instanzvariablen?


Zumindest bei mir sind die meist die gesamte Lebenszeit ganz explizit nicht null (und oft final). Genullt wird da nichts nur für GC, nur wenn null eben auch normaler Zustand ist, passiert aber selten.
Das meiste gibts eh nur in Methoden, ist also außerhalb eh nicht erreichbar.
 
Im Normalfall reicht es, die Variable, die den Dialog hält, lokal z.B. in der ButtonHandler Methode anzulegen und nicht nach außen weiterzugeben. Damit wird ihre Referenz beim Beenden der Methode aufgelöst, der Dialog verschwidnet im GC. Greife auch auf Standard-Dialoge wie JOptionPane zurück, dann sparst du dir so manche Überlegung. Manuell auf null setzen muss man so gut wie nie.
 

Zurück
Oben