Was passiert in Java, wenn ein Objekt nicht instanziiert werden kann?

8

Ich komme von einem c ++ Hintergrund und ich finde mich ständig in Java:

%Vor%

Was ich wissen möchte ist, was in der Variablen sc sein wird, wenn der Konstruktor aus irgendeinem Grund fehlschlägt (wie vielleicht nicht genug Speicher). Ich kann' Ich finde eine klare Antwort, und ich mache mir Sorgen, dass ich nur meine Zeit verschwende, denn wenn der neue Betreiber scheitert, würde das Programm sowieso einfach abstürzen?

    
user412723 06.08.2010, 06:55
quelle

6 Antworten

12

Die Java Specification Language 3rd Edition deckt Ihre Frage gründlich ab:

  

12.5 Erstellen neuer Klasseninstanzen

     

Immer wenn eine neue Klasseninstanz erstellt wird, wird ihr Speicherplatz für alle Instanzvariablen zugewiesen, die im Klassentyp deklariert sind, sowie für alle Instanzvariablen, die in jeder Oberklasse des Klassentyps deklariert sind, einschließlich aller möglichen Instanzvariablen versteckt sein. Wenn nicht genügend Speicherplatz verfügbar ist, um Speicher für das Objekt zuzuordnen, wird die Erstellung der Klasseninstanz abrupt mit einem %Co_de% . Andernfalls werden alle Instanzvariablen im neuen Objekt, einschließlich der in Superklassen deklarierten, auf ihre Standardwerte initialisiert.

     

Kurz bevor ein Verweis auf das neu erstellte Objekt als Ergebnis zurückgegeben wird, wird der angegebene Konstruktor verarbeitet, um das neue Objekt mit der folgenden Prozedur zu initialisieren: [...]

Es ist also einfach nicht möglich, dass ein OutOfMemoryError Ausdruck new zurückgibt. Was auch immer zurückgegeben wird, wenn die Ausführung normal abgeschlossen wird, ist immer eine gültige null -Klasse, die instanziiert wurde.

Behandlung von Ausnahmen

Im Allgemeinen werden mögliche Ausnahmen normalerweise mit einem instanceof -Block behandelt:

%Vor%

In Ihrem Fall können Sie try-catch in einen new SomeClass() -Block mit einem entsprechenden try einfügen, aber das ist höchst untypisch. Sofern Sie nicht vorhaben, in diesem Fall etwas Sinnvolles zu tun, ist es in den meisten typischen Szenarien am besten, nicht catch (OutOfMemoryError e) any catch , das während der Programmausführung auftreten kann.

Aus der Dokumentation:

  

Ein Error ist eine Unterklasse von Error , die auf schwerwiegende Probleme hinweist, die eine sinnvolle Anwendung nicht Throwable bis try sein sollte. Die meisten dieser Fehler sind abnorme Bedingungen.

     

Eine Methode ist nicht erforderlich, um in ihrer catch -Klausel irgendwelche Unterklassen von throws zu deklarieren, die während der Ausführung der Methode geworfen, aber nicht abgefangen werden, da diese Fehler abnormale Bedingungen sind, die niemals auftreten sollten.

Verwandte Fragen

Siehe auch

polygenelubricants 06.08.2010, 07:51
quelle
6

Wenn der Konstruktor fehlgeschlagen ist, würde eine Exception oder ein Fehler ausgegeben und Sie würden nicht weiter in das Programm kommen. Genauer gesagt, wenn der Speicher nicht mehr ausreicht, erhalten Sie OutOfMemoryError .

    
GaryF 06.08.2010 06:56
quelle
1

Ja, du verschwendest deine Zeit :-). sc ist garantiert nicht null, nachdem der Konstruktor aufgerufen wurde. Wenn der Konstruktor fehlschlägt, wird eine Ausnahme ausgelöst und der folgende Code wird nie ausgeführt. Daher ist Folgendes in Java sicher:

%Vor%

ohne eine NullPointerException zu werfen.

    
Dean Povey 06.08.2010 06:58
quelle
1

Das if check wird nicht benötigt, und einige IDEs beschweren sich sogar, dass es unnötig ist, da es immer auf true auswertet. Der einzige Grund, dass new fehlschlägt, ist, wenn der Konstruktor eine Ausnahme ausgelöst hat, und in diesem Fall wird Ihre if Prüfung sowieso umgangen.

    
Nate W. 06.08.2010 06:59
quelle
1
%Vor%

Eine Objektreferenz ist niemals null nach dem Erstellen eines Objekts, daher ist die Nullprüfung unnötig, da die Bedingung immer wahr ist.

Wenn beispielsweise an der Stelle im Konstruktor nicht genügend Speicher vorhanden ist, wird ein OutOfMemoryError geworfen und der Konstruktor wird nicht normal zurückkehren.

    
Jesper 06.08.2010 07:00
quelle
0

Es wird ein OutOfMemoryError geworfen, der normalerweise den Absturz verursacht virtuelle Maschine. (Könnte als Throwable eingefangen werden)

Sie finden Verhindern und Wiederherstellen von Java OutOfMemory Error nützlich.

    
stacker 06.08.2010 07:00
quelle