Programs must not catch java.lang.NullPointerException
. A NullPointerException
exception thrown at runtime indicates the existence of an underlying null
pointer dereference that must be fixed in the application code (see rule EXP01-J. Do not use a null in a case where an object is required for more information). Handling the underlying null pointer dereference by catching the NullPointerException
rather than fixing the underlying problem is inappropriate for several reasons. First, catching NullPointerException
adds significantly more performance overhead than simply adding the necessary null checks [Bloch 2008]. Second, when multiple expressions in a try
block are capable of throwing a NullPointerException
, it is difficult or impossible to determine which expression is responsible for the exception because the NullPointerException
catch
block handles any NullPointerException
thrown from any location in the try
block. Third, programs rarely remain in an expected and usable state after a NullPointerException
has been thrown. Attempts to continue execution after first catching and logging (or worse, suppressing) the exception rarely succeed.
...
This noncompliant code example is derived from the logging service null object design pattern described by Henney [Henney 2003]. The logging service is composed of two classes: one that prints the triggering activity's details to a disk file using the FileLog
class and another that prints to the console using the ConsoleLog
class. An interface, Log
, defines a write()
method that is implemented by the respective log classes. Method selection occurs polymorphically at runtime. The logging infrastructure is subsequently used by a Service
class.
...
Some system designs require returning a value from a method rather than implementing do-nothing behavior. One acceptable approach is use of an exceptional value object that throws an exception before the method returns [Cunningham 1995]. This can be a useful alternative to returning null
.
...
ERR08-EX1: Task processing threads such as worker threads in a thread pool or the Swing event dispatch thread are permitted to catch RuntimeException
when they call untrusted code through an abstraction such as the Runnable
interface [Goetz 2006, p. 161].
ERR08-EX2: Systems that require substantial fault tolerance or graceful degradation are permitted to catch and log general exceptions such as Throwable
at appropriate levels of abstraction. For example:
...
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
ERR08-J | medium | likely | medium | P12 | L1 |
...