Ich erwarte, dass der gepufferte Reader und der Dateireader geschlossen und die Ressourcen freigegeben werden, wenn die Ausnahme ausgelöst wird.
public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
try (BufferedReader br = new BufferedReader(new FileReader(filePath)))
{
return read(br);
}
}
Gibt es jedoch eine Voraussetzung für eine catch
erfolgreiche Schließung?
BEARBEITEN:
Entspricht der obige Code in Java 7 im Wesentlichen dem folgenden für Java 6:
public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
BufferedReader br = null;
try
{
br = new BufferedReader(new FileReader(filePath));
return read(br);
}
catch (Exception ex)
{
throw ex;
}
finally
{
try
{
if (br != null) br.close();
}
catch(Exception ex)
{
}
}
return null;
}
java-7
try-with-resources
Gepard
quelle
quelle
catch
Beispiels für Java 6 zu verstehen. Das heißt,catch (Exception ex) { throw ex; }
es wird nur die Ausnahme erneut ausgelöst, es tut nichts, es kann leicht entfernt werden, ohne dass es verletzt wird. Oder fehlt mir etwas?Antworten:
Es ist korrekt und es ist keine
catch
Klausel erforderlich . Laut Oracle Java 7-Dokument wird die Ressource geschlossen, unabhängig davon, ob tatsächlich eine Ausnahme ausgelöst wird oder nicht.Sie sollten eine
catch
Klausel nur verwenden, wenn Sie auf die Ausnahme reagieren möchten. Diecatch
Klausel wird ausgeführt, nachdem die Ressource geschlossen wurde.Hier ist ein Ausschnitt aus dem Tutorial von Oracle :
BEARBEITEN
In Bezug auf die neu bearbeitete Frage:
Der Code in Java 6 führt den
catch
und danach denfinally
Block aus. Dies führt dazu, dass die Ressourcen möglicherweise noch imcatch
Block geöffnet sind.In der Java 7-Syntax werden Ressourcen vor dem
catch
Block geschlossen , sodass Ressourcen bereits während dercatch
Blockausführung geschlossen werden . Dies ist im obigen Link dokumentiert:quelle
Ihre Verwendung von Try-with-Resources funktioniert in diesem speziellen Fall einwandfrei, ist jedoch im Allgemeinen nicht ganz korrekt. Sie sollten solche Ressourcen nicht verketten, da dies zu unangenehmen Überraschungen führen kann. Angenommen, Sie haben eine variable Puffergröße:
Angenommen, etwas ist schiefgegangen und Sie
sz
waren negativ. In diesem Fall wird Ihre Dateiressource (erstellt übernew FileReader(filePath)
) NICHT geschlossen.Um dieses Problem zu vermeiden, sollten Sie jede Ressource wie folgt separat angeben:
In diesem Fall wird die Initialisierung von
br
fehlgeschlagenfile
immer noch geschlossen. Weitere Details finden Sie hier und hier .quelle
new FileReader(filePath))
nicht geschlossen wird, falls eineIllegalArgumentException
ausgelöst wird, wenn sz negativ ist. Schließt der Versuch mit Ressourcen nicht alleAutoClosable
Ressourcen, unabhängig von den ausgelösten Ausnahmen?.close()
die Variablen aufgerufen, die im Initialisierer "Try-with-Resources" deklariert wurden. Deshalb reicht es aus, es in diesem Beispiel in zwei Deklarationen zu trennen.sz < 0
der Konstruktor eine Ausnahme auslöst, tatsächlich dazu führt, dass die Ressource ausläuft.