When you declare a reference variable (i.e. an object) you are actually creating a reference to an object. Consider the following code where you declare a variable of primitive type int:
int num=0;
num=100;
In this example, the variable num is an int and Java initializes it to 0. When you assign num to 100,value 100 is written into the memory location pointed by num.
But, when you try to declare a reference type this is not the case
Integer num;
num = new Integer(100);
The first line declares a variable named num, but, it does not contain a primitive value. Instead, it contains a reference (because the type is Integer which is an object of the Wrapper class). Since you did not say what to point to, Java sets it to null, meaning "I am pointing at nothing".
In the second line, the new keyword is used to instantiate (or create) an object of type Integer and the pointer variable num is assigned this object. You can now reference the object using the dereferencing operator . (a dot).
TheNullPointerException occurs when you declare a variable but did not create an object. If you attempt to dereference num before creating the object you get a NullPointerException.
In the most cases, the compiler will catch the problem and let you know that "num may not have been initialized" but sometimes you write code that does not directly create the object.
For instance, you may have a method as follows:
public void doSomething(SomeObject obj) {
//do something to obj
}
In which case you are not creating the object obj, rather assuming that it was created before the doSomething method was called. Unfortunately, it is possible to call the method like this:
doSomething(null);
in which case obj is null. If the method is intended to do something to the passed-in object, it is appropriate to throw the NullPointerException because it's a programmer error and the programmer will need that information for debugging purposes.
There may be cases where the purpose of the method is not solely to operate on the passed object, and therefore a null parameter may be acceptable. In this case, you would need to check for a null parameter and behave differently. You should also explain this in the documentation. For example, doSomething could be written as:
/**
* @param obj An optional foo for ____. May be null, in which case
* the result will be ____.
*/
public void doSomething(SomeObject obj) {
if(obj != null) {
//do something
} else {
//do something else
}
}