Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

According to the Java Language Specification, §11.1.1, "The Kinds of Exceptions" [JLS 20112013],

The unchecked exceptions classes are the class RuntimeException and its subclasses, and the class Error and its subclasses. All other exception classes are checked exception classes.

Unchecked exception classes are not subject to compile-time checking because it is tedious to account for all exceptional conditions and because recovery is generally often difficult or impossible. However, even when recovery is impossible, the Java Virtual Machine (JVM) allows a graceful exit and a chance to at least log the error. This is made possible by using a try-catch block that catches Throwable. Also, when code must avoid leaking potentially sensitive information, catching Throwable is permitted. In all other cases, catching Throwable is not recommended because it makes handling specific exceptions difficult. Where cleanup operations such as releasing system resources can be performed, code should use a finally block to release the resources or a try-with-resources statement.

Catching Throwable is disallowed in general by ERR08-J. Do not catch NullPointerException or any of its ancestors, but it is permitted when filtering exception traces by the exception ERR08-EX0 of in that rule.

Noncompliant Code Example

...

Note that the Forward to handler code must operate correctly in very constrained memory conditions because the stack or heap may be nearly exhausted. In such a scenario, one useful technique would be is for the program to initially reserve memory specifically to be used by an out-of-memory exception handler.

...

In the event of actually running out of memory, it is likely that some program data will be in an inconsistent state. Consequently, it might be best to restart the process. If an attempt is made to carry on, reducing the number of threads or simply cycling them may be a good an effective workaround. This measure can help in such scenarios because threads often leak memory, and their continued existence can increase the memory footprint of the program.

The methods Thread.setUncaughtExceptionHandler() and ThreadGroup.uncaughtException() can be used to help deal with an OutOfMemoryError in threads.

Bibliography

[JLS 20112013]§11.2, "Compile-Time Checking of Exceptions"
[Kalinovsky 2004]Chapter 16, "Intercepting Control Flow: Intercepting System Errors"

...