In Java, a NullPointerException
occurs when a variable that is being accessed has not yet been assigned to an object, in other words, the variable is assigned as null
.
If you have read the Sentry answer to Is Java Pass-By-Reference or Pass-By-Value?, you might know that in Java, variables are simply pointers to objects in memory. Therefore, a null pointer exception will occur when the code is pointing to something in memory that does not exist.
The Java API documentation on NullPointerException
lists a couple of scenarios where this exception could be invoked:
null
object.null
object.null
as if it were an array.null
as if it were an array.null
as if it were a Throwable value.Let’s take a look at a concrete example of where a NullPointerException
might be thrown.
Consider the following code example:
class NullPointerExample { private static void printFirstElement(String[] array) { System.out.println(array[0]); } public static void main(String[] args) { String[] myStringArray = null; printFirstElement(myStringArray); } }
Executing this code will result in the following stack trace:
Exception in thread "main" java.lang.NullPointerException at NullPointerExample.printFirstElement(NullPointerExample.java:6) at NullPointerExample.main(NullPointerExample.java:11)
This happens because in our printFirstElement()
method, we attempted to access the first element of an array which does not exist. Similarly, taking the length of this given array would yield the same result. We could make this code null-safe by adding a check for null before attempting to access the first element:
class NullPointerExample { private static void printFirstElement(String[] array) { if (null != array){ System.out.println(array[0]); } else{ System.out.println("The array was null!"); } } public static void main(String[] args) { String[] myStringArray = null; printFirstElement(myStringArray); } }
Executing this code now will yield the following output:
The array was null!
This is one important technique we can use to avoid tumbling into a NullPointerException
during code execution. Some tips for avoiding a NullPointerException
include:
int
, boolean
and char
, as these cannot be assigned as null and therefore cannot cause a NullPointerException
.NullPointerException
issues before you actually execute any of your code.@NotNull
and @Nullable
annotations.