Diese Frage quält mich schon eine Weile, aber ich habe noch keine vollständige Antwort darauf gefunden (z.B. diese hier ist für C# Initialisierung verfügbarer Ressourcen außerhalb oder innerhalb von try/finally ). Betrachten Sie die beiden folgenden Java-Codefragmente:
Closeable in = new FileInputStream("data.txt");
try {
doSomething(in);
} finally {
in.close();
}
und die zweite Variante
Closeable in = null;
try {
in = new FileInputStream("data.txt");
doSomething(in);
} finally {
if (null != in) in.close();
}
Der Teil, der mich beunruhigt, ist, dass der Thread etwas zwischen dem Moment unterbrochen werden könnte, Ressource erworben wird (z. B. Datei geöffnet wird), aber resultierende Wert wird nicht an entsprechende lokale Variable zugewiesen. Gibt es andere Szenarien, die der Thread im obigen Punkt unterbrochen werden könnte, außer:
- InterruptedException (z. B. über Thread#interrupt()) oder OutOfMemoryError-Ausnahme ausgelöst wird
- Beenden der JVM (z. B. über kill, System.exit())
- Hardwarefehler (oder Fehler in der JVM für eine vollständige Liste :)
Ich habe gelesen, dass der zweite Ansatz etwas "idiomatischer" ist, aber IMO gibt es in dem obigen Szenario keinen Unterschied und in allen anderen Szenarien sind sie gleich.
Daher die Frage:
Was sind die Unterschiede zwischen den beiden? Welcher sollte ich den Vorzug geben, wenn ich mir Gedanken über das Freigeben von Ressourcen mache (insbesondere bei stark multi-threading-fähigen Anwendungen)? Und warum?
Ich wäre dankbar, wenn mir jemand Hinweise auf Teile der Java/JVM-Spezifikationen geben könnte, die die Antworten unterstützen.