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?
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.
Im Allgemeinen werden mögliche Ausnahmen normalerweise mit einem instanceof
-Block behandelt:
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 vonError
, die auf schwerwiegende Probleme hinweist, die eine sinnvolle Anwendung nichtThrowable
bistry
sein sollte. Die meisten dieser Fehler sind abnorme Bedingungen.Eine Methode ist nicht erforderlich, um in ihrer
catch
-Klausel irgendwelche Unterklassen vonthrows
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.
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.
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.
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.
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.
Tags und Links java new-operator object instantiation creation