Betrachten Sie das einfache Beispiel in Java unten. Was passiert, wenn ich ein Objekt durch Aufruf von new B(0)
erstelle? Zuerst wird ein Objekt vom Typ B im Speicher erstellt. Dann wird der Ausdruck 1 / n eine Ausnahme auslösen. Das erstellte Objekt wird jedoch niemals gemäß der Java-Spezifikation (§12.6.1) finalisiert. Also bekommen wir ein Speicherleck?
Bitte beachten Sie, dass ich nicht fragen kann "kann ein Konstruktor eine Ausnahme auslösen", sondern "was passiert, wenn ein Konstruktor in einer bestimmten Situation eine Ausnahme auslöst."
%Vor%Ein Objekt o ist nicht finalisierbar, bis sein Konstruktor den Konstruktor für Object ono aufgerufen hat und dieser Aufruf erfolgreich abgeschlossen wurde (dh ohne eine Ausnahme auszulösen).
Der Abschnitt, den Sie angeben, unterscheidet zwischen Erreichbarkeit und Finalisierbarkeit:
Jedes Objekt kann durch zwei Attribute charakterisiert werden: Es kann erreichbar, für den Finalizer erreichbar oder unerreichbar sein, und es kann auch nicht finalisiert, finalisierbar oder finalisiert sein.
So kann ein Objekt erreichbar oder unerreichbar und finalisierbar oder nicht finalisierbar sein.
Wenn Sie erwähnen, dass der Object
-Konstruktor noch nie ausgeführt wurde, ist das Objekt nicht finalisierbar, aber OTOH, der Konstruktor, hat eine Ausnahme ausgelöst, so dass die Zuweisung des new
-Ergebnisses an eine Variable nie stattfindet es ist unerreichbar.
Es gibt also kein Speicherleck.
Tags und Links java