Am I using the Java 7 try-with-resources correctly

前端 未结 2 2055
一生所求
一生所求 2020-11-27 02:23

I am expecting the buffered reader and file reader to close and the resources released if the exception is throw.

public static Object[] fromFile(String file         


        
2条回答
  •  天涯浪人
    2020-11-27 03:09

    It's correct and there's no requirement for catch clause. Oracle java 7 doc says the resource will be closed regardless of whether an exception is actually thrown or not.

    You should use a catch clause only if you want to react upon the exception. The catch clause will be executed after the resource is closed.

    Here's a snippet from Oracle's tutorial:

    The following example reads the first line from a file. It uses an instance of BufferedReader to read data from the file. BufferedReader is a resource that must be closed after the program is finished with it:

    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.
    

    ... Because the BufferedReader instance is declared in a try-with-resource statement, it will be closed regardless of whether the try statement completes normally or abruptly (as a result of the method BufferedReader.readLine throwing an IOException).

    EDIT

    Regarding the new edited question:

    The code in Java 6 executes the catch and afterwards the finally block. This causes the resources to be still potentially opened in the catch block.

    In Java 7 syntax, resources are closed before the catch block, so resources are already closed during the catch block execution. This is documented in the above link:

    In a try-with-resources statement, any catch or finally block is run after the resources declared have been closed.

提交回复
热议问题