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-finally
blocks (pre-Java 7).try-with-resources
blocks (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
try
block). - 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
IOException
is the primary exception. - The
IllegalStateException
fromclose()
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
finally
override the original. - Java 7+:
try-with-resources
keeps 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.