1. Overview

In this short article, we’re going to show how to properly catch Java errors, and we’ll explain when it doesn’t make sense to do so.

For detailed information about Throwables in Java, please have a look at our article on Exception Handling in Java.

2. Catching Errors

Since the java.lang.Error class in Java doesn’t inherit from java.lang.Exception, we must declare the Error base class – or the specific Error subclass we’d like to capture – in the catch statement in order to catch it.

Therefore, if we run the following test case, it will pass:

@Test(expected = AssertionError.class)
public void whenError_thenIsNotCaughtByCatchException() {
    try {
        throw new AssertionError();
    } catch (Exception e) {
        Assert.fail(); // errors are not caught by catch exception

The following unit test, however, expects the catch statement to catch the error:

public void whenError_thenIsCaughtByCatchError() {
    try {
        throw new AssertionError();
    } catch (Error e) {
        // caught! -> test pass

Please note that the Java Virtual Machine throws errors to indicate severe problems from which it can’t recover, such as lack of memory and stack overflows, among others.

Thus, we must have a very, very good reason to catch an error!

3. Conclusion

In this article, we saw when and how Errors can be caught in Java. The code example can be found in the GitHub project.

Course – LS (cat=Java)

Get started with Spring and Spring Boot, through the Learn Spring course:

res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.