Exceptions in Java are errors that disrupt normal program flow. But what if multiple exceptions occur at once? This is where suppressed exceptions come into play. Let’s explore how Java handles them, with examples and simple explanations.
Table of Contents
What Are Suppressed Exceptions?
Suppressed exceptions occur when multiple exceptions are thrown, but only one is reported. The others are “suppressed” (attached to the primary exception). This often happens in:
try-catch-finallyblocks (pre-Java 7).try-with-resourcesblocks (Java 7+).
Example 1: The Problem with try-catch-finally
In older Java versions, if exceptions occur in both the try and finally blocks, the finally exception overrides the original one.
Code Example:
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
System.out.println("Inside try block");
throw new IOException("Error in try"); // Primary exception
} finally {
System.out.println("Inside finally block");
throw new NullPointerException("Error in finally"); // Overrides the original!
}
}
}

Output:
Inside try block
Inside finally block
Exception in thread "main" java.lang.NullPointerException: Error in finally
at Main.main(Main.java:10)
Problem: The IOException from the try block is lost because the finally block’s exception takes over.
Java 7+ Solution: try-with-resources
Java 7 introduced try-with-resources and the addSuppressed() method. Now, if multiple exceptions occur, the primary exception is thrown, and others are attached as suppressed.
How Suppression Works:
- Primary Exception: The first exception thrown (e.g., in the
tryblock). - Suppressed Exceptions: Subsequent exceptions (e.g., in
close()method of resources).
Example 2: try-with-resources
Let’s create a custom resource and see suppression in action.
Step 1: Define a Resource
class MyResource implements AutoCloseable {
@Override
public void close() throws Exception {
throw new IllegalStateException("Error closing resource"); // Suppressed!
}
}
Step 2: Use try-with-resources
import java.io.*;
public class Main {
public static void main(String[] args) {
try (MyResource resource = new MyResource()) {
throw new IOException("Error in try block"); // Primary exception
} catch (Exception e) {
System.out.println("Primary Exception: " + e.getMessage());
for (Throwable suppressed : e.getSuppressed()) {
System.out.println("Suppressed: " + suppressed.getMessage());
}
}
}
}

Output:
Primary Exception: Error in try block
Suppressed: Error closing resource
Key Points:
- The
IOExceptionis the primary exception. - The
IllegalStateExceptionfromclose()is suppressed and attached.
How to Catch All Exceptions
Use getSuppressed() to retrieve suppressed exceptions:
try {
// Code that throws exceptions
} catch (Exception e) {
System.out.println("Main Exception: " + e.getMessage());
Throwable[] suppressed = e.getSuppressed();
for (Throwable s : suppressed) {
System.out.println("Suppressed: " + s.getMessage());
}
}
Benefits of Suppressed Exceptions
- No Lost Exceptions: All errors are recorded.
- Better Debugging: See the full chain of failures.
- Cleaner Code: No need for nested try-catch blocks.
Potential Problems
- Complexity: Beginners might overlook suppressed exceptions.
- Java Version Dependency: Requires Java 7+.
- Manual Handling: You must explicitly call
getSuppressed().
Summary
- Pre-Java 7: Exceptions in
finallyoverride the original. - Java 7+:
try-with-resourceskeeps all exceptions (primary + suppressed). - Use
getSuppressed(): To retrieve attached exceptions.
By understanding suppressed exceptions, you can debug complex issues and write robust Java code!
FAQs
How do I access suppressed exceptions without try-with-resources?
Use Throwable.addSuppressed() and getSuppressed() manually.
Are suppressed exceptions only for AutoCloseable resources?
No, but they’re most common in try-with-resources.
Can a suppressed exception become the primary one?
No. The first exception in the try block is primary.
Does Java 8 handle suppressed exceptions differently?
No—the behavior is consistent from Java 7 onward.