JAVA

try-with-resources in Java

neal89 2025. 3. 31. 14:58

A Deep Dive into Safe and Elegant Resource Management

When working with I/O operations in Java, such as file streams, sockets, or database connections, it's essential to release resources properly to avoid memory leaks or locked files. Java provides a convenient and safe feature called try-with-resources to manage such resources efficiently.


Why Resource Management Matters

Many classes in Java (like InputStream, OutputStream, Socket, Connection, etc.) use system-level resources. If you forget to close them, it can lead to:

  • File or socket locks
  • Out-of-memory issues
  • Resource exhaustion in long-running applications

Traditionally, resource management looked like this:

BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader("data.txt"));
    String line = reader.readLine();
    System.out.println(line);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

This code is verbose and error-prone, especially if multiple resources are involved.


Enter try-with-resources

Java 7 introduced the try-with-resources statement, which automatically closes resources when the try block is exited, even if an exception occurs.

✅ Requirements

  • The resource must implement the AutoCloseable interface (or Closeable which extends it).

✅ Basic Example

try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
    String line = reader.readLine();
    System.out.println(line);
} catch (IOException e) {
    e.printStackTrace();
}

✅ Much cleaner
✅ Automatically closes the reader
✅ No need for a finally block


Multiple Resources

You can manage multiple resources in a single try-with-resources block. They will be closed in reverse order of creation.

try (
    FileInputStream fis = new FileInputStream("data.txt");
    InputStreamReader isr = new InputStreamReader(fis);
    BufferedReader reader = new BufferedReader(isr)
) {
    System.out.println(reader.readLine());
} catch (IOException e) {
    e.printStackTrace();
}

Custom Resources (AutoCloseable)

You can define your own classes that can be used in a try-with-resources block.

public class MyResource implements AutoCloseable {
    @Override
    public void close() {
        System.out.println("Closing MyResource");
    }

    public void doSomething() {
        System.out.println("Doing something...");
    }
}
try (MyResource resource = new MyResource()) {
    resource.doSomething();
}

Exception Handling: Suppressed Exceptions

If both the main try block and the close() method throw exceptions, Java will throw the main exception and suppress the close exception.

public class MyResource implements AutoCloseable {
    @Override
    public void close() throws Exception {
        throw new Exception("Error during close");
    }

    public void doWork() throws Exception {
        throw new Exception("Error during work");
    }
}
try (MyResource r = new MyResource()) {
    r.doWork();
} catch (Exception e) {
    System.out.println("Main Exception: " + e.getMessage());
    for (Throwable suppressed : e.getSuppressed()) {
        System.out.println("Suppressed: " + suppressed.getMessage());
    }
}

Output:

Main Exception: Error during work  
Suppressed: Error during close

This is very helpful in debugging complex issues.


When Not to Use try-with-resources

  • If the resource's lifetime must go beyond the scope of a single method
  • If the resource is shared across different parts of the program
  • When you need to manage cleanup explicitly (like in server socket shutdown hooks)

In those cases, you might still need try-finally blocks and utility cleanup methods.


Summary

Automatic closing Prevents resource leaks
Simplified syntax Less boilerplate, better readability
Exception-safe Handles both primary and close() exceptions properly
Multiple resources support Closes in reverse order of declaration
Custom resource support Implement AutoCloseable to integrate with this syntax

 

'JAVA' 카테고리의 다른 글

Java Annotation  (0) 2025.04.01
Java reflection  (0) 2025.04.01
Java File vs Files  (0) 2025.03.29
Java I/O stream  (0) 2025.03.29
Understanding Character Encoding in Java  (1) 2025.03.29