How to avoid NullPointerException in Java
NullPointerException
will be thrown when an application attempts to use null in a case where an object is required. As per the Java API Doc, these are the possible situations.
- Calling the instance method of a null object.
- Accessing or modifying the field of a null object.
- Taking the length of null as if it were an array.
- Accessing or modifying the slots of null as if it were an array.
- Throwing null as if it were a Throwable value.
NullPointerException
is a RuntimeException
that can be thrown during the normal operation of the Java Virtual Machine (JVM).
It is an unchecked exception. Since JVM is directly throwing this exception, we don't need to declare it in a method signature or in a constructor's throws clause.
Consider the following example:
1. int a;
2. a = 5;
3. Integer b;
4. int c;
5. c = b
6. b = new Integer(5);
In this example variable a
is the primitive type int
, so when the code execution reaches at line# 1, a
is having the default value 0
.
At line# 2, we are assigning the value 5
to a
. From this point onward, a
is having the value 5
until it is being assigned with a new value. In general, premitive types will always have a non-null value.
Let's consider the variable b
, It got the reference type Intger
, unlike its primitive type int
, this reference type has a default value null
. At line# 3, we are not assigning any value, so b
is pointing to null
. At line# 5, we are assigning a value of 5
to b
by instantiating an object type of Integer
by using the operator new
. Now b
is pointing to a proper memory location and holds a proper value.
Let's consider the variable c
. Even though it is defined as a primitive type, at line# 5, it is assigned with the Integer
reference b
, which is not yet initialized. So, further usage of c
will definitely through NullPointerException
.
NullPointerException
occurs when you try to access an object or its properties, before it is being initialized.Other possibilities
Let's see this scenario:
}
In this scenario, since obj
is not owned by myMethod()
, we cannot guarantee that obj
will be always non-null. obj.doSomething()
will through NullPointerException
when obj
is null
.
Let's see this scenario:
}
Here even though, obj
is non-null, there is no guarantee that outRefObject.getSomethingElse(obj)
will return a non-null object since we are not owning getSomethingElse()
.
There is a big chance of NullPointerException
when you call obj2.doSomethingElse();
How can I avoid NullPointerException?
(i) Check for null
First is first. If your code is not owning the object under doubt, always go for null check, before using it.
}
}
(ii) Use the utility method Objects.nonNull(Object obj)
From 1.8 onward, java offers the static method nonNull(Object obj)
, that will return false
if obj
is null
.
}
}
(iii) Do null check for the inner object too.
If your interest is not at obj
, but one of its property (innerObj) of Object type, then you should do the null check for that inner object too.
}
}
(iv) Use the utility method Optional.ofNullable(Object obj)
From 1.8 onward, java offers the static method ofNullable(Object obj)
, that will return an empty Optional
object if obj
is null
. If obj
is non-null, then this method returns an Optional
object with obj
. You can check the presence of an actual object by using either isEmpty()
or isPresent()
on this Optional
object. The actual object can be obtained by calling get()
on this Optional object.
Optional.ofNullable(
}
}
How can I handle NullPointerException?
Yes, it is practically possible to handle NullPointerException
like any other exceptions by the try...catch block.
But you should avoid handling NullPointerException
or any RuntimeException
why because all of them are unchecked exceptions.NullPointerException
is a clue to the developer to handle some possible defects in the code.
Conclusion
- We have learnt what is NullPointerException.
- When NullPointerException occurs.
- How can we avoid NullPointerException.
- Some good java coding practices.