Talos
Talos

Reputation: 480

Exceptions from both try block and try-with-resources

Documentation says

However, in this example, if the methods readLine and close both throw exceptions, then the method readFirstLineFromFileWithFinallyBlock throws the exception thrown from the finally block; the exception thrown from the try block is suppressed. In contrast, in the example readFirstLineFromFile, if exceptions are thrown from both the try block and the try-with-resources statement, then the method readFirstLineFromFile throws the exception thrown from the try block; the exception thrown from the try-with-resources block is suppressed. In Java SE 7 and later, you can retrieve suppressed exceptions; see the section Suppressed Exceptions for more information.

I don't understand the bold part

... if exceptions are thrown from both the try block and the try-with-resources statement ...

How can an exception be thrown from both the try-with-resources statement and the try block ? If the exception is thrown from the try-with-resources statement, it means that resource initialization failed. In this case, try block is never executed. Thus the previous statement can't happen.

I must have misunderstood this documentation and how try-with-resources works. Can you provide example where the bold statement actually happens ?


Mentioned methods
static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}
static String readFirstLineFromFileWithFinallyBlock(String path)
                                                     throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        if (br != null) br.close();
    }
}

Upvotes: 1

Views: 617

Answers (2)

ice
ice

Reputation: 44

oracle documentation sucks. i wouldn't call try-with-resources block for implicit close methods, but rather for constructors and doc doesn't say anything about exception in constructors

Upvotes: 0

Joni
Joni

Reputation: 111409

How can an exception be thrown from both the try-with-resources statement and the try block ? If the exception is thrown from the try-with-resources statement, it means that resource initialization failed.

The try-with-resources statement not only initializes but also closes the resource, and closing may throw an exception.

This sentence comes right after a description of a similar situation when using try-finally, and compares it with try-with-resources.

Upvotes: 2

Related Questions