Frage Benutze ich die Java 7 Try-mit-Ressourcen korrekt


Ich erwarte, dass der gepufferte Leser und Dateileser schließt 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 Anforderung, ein zu haben? catch Klausel für den erfolgreichen Abschluss?

BEARBEITEN:

Im Wesentlichen entspricht der obige Code in Java 7 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;
}

76
2017-07-15 09:32


Ursprung


Antworten:


Es ist korrekt und es gibt keine Voraussetzung dafür catch Klausel. Oracle Java 7 Doc sagt, dass die Ressource geschlossen wird ungeachtet ob eine Ausnahme tatsächlich ausgelöst wird oder nicht.

Sie sollten ein verwenden catch Klausel nur, wenn Sie auf die Ausnahme reagieren möchten. Das catch Klausel wird ausgeführt nach Die Ressource ist geschlossen.

Hier ist ein Ausschnitt von Oracles Tutorial:

Im folgenden Beispiel wird die erste Zeile einer Datei gelesen. Es verwendet ein   Instanz von BufferedReader zum Lesen von Daten aus der Datei. GepufferterReader   ist eine Ressource, die nach dem Beenden des Programms geschlossen werden muss   es:

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
} // In this example, the resource declared in the try-with-resources statement is a BufferedReader.

... Da die BufferedReader-Instanz in a deklariert ist   try-with-resource-Anweisung, es wird unabhängig davon geschlossen, ob   Die try - Anweisung wird normalerweise oder abrupt beendet (als Ergebnis der   Methode BufferedReader.readLine wirft eine IOException).

BEARBEITEN

In Bezug auf die neu editierte Frage:

Der Code in Java 6 führt das aus catch und danach die finally Block. Dies führt dazu, dass die Ressourcen möglicherweise noch in der catch Block.

In der Java 7-Syntax werden Ressourcen geschlossen Vor das catch blockieren, also Ressourcen sind bereits während der geschlossen catch Blockausführung. Dies ist im obigen Link dokumentiert:

In einer try-with-resources-Anweisung wird ein beliebiger catch- oder finally-Block ausgeführt   nachdem die deklarierten Ressourcen geschlossen wurden.


94
2017-07-15 09:40



Ihre Verwendung von Try-with-resources wird in diesem speziellen Fall gut funktionieren, aber es ist 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:

public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
    int sz = /* get buffer size somehow */
    try (BufferedReader br = new BufferedReader(new FileReader(filePath), sz))
    {
        return read(br);
    } 
}

Angenommen, etwas ist schief gelaufen und du hast es geschafft sz negativ sein. In diesem Fall wird Ihre Dateiressource (erstellt über new FileReader(filePath)) werden NICHT geschlossen.

Um dieses Problem zu vermeiden, sollten Sie jede Ressource separat wie folgt angeben:

public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
    int sz = /* get buffer size somehow */
    try (FileReader file = new FileReader(filePath);
         BufferedReader br = new BufferedReader(file, sz))
    {
        return read(br);
    } 
}

In diesem Fall auch bei Initialisierung von br schlägt fehl file wird immer noch geschlossen. Sie können mehr Details finden Hier und Hier.


64
2018-01-25 09:37