Why does using a default-valued Java Integer result in a NullPointerException?
-
19-09-2019 - |
Question
I am new to Java. I just read that class variables in Java have default value.
I tried the following program and was expecting to get the output as 0
, which is the default value on an integer, but I get the NullPointerException
.
What am I missing?
class Test{
static Integer iVar;
public static void main(String...args) {
System.out.println(iVar.intValue());
}
}
Solution
You are right, uninitialized class variables in Java have default value assigned to them. Integer
type in Java are not same as int
. Integer
is the wrapper class which wraps the value of primitive type int
in an object.
In your case iVar
is a reference to an Integer
object which has not been initiliazed. Uninitialized references get the default value of null
and when you try to apply the intValue
() method on a null reference you get the NullPointerException
.
To avoid this problem altogether you need to make your reference variable refer to an Integer
object as:
class Test {
// now iVar1 refers to an integer object which wraps int 0.
static Integer iVar1 = new Integer(0);
// uninitialized int variable iVar2 gets the default value of 0.
static int iVar2;
public static void main(String...args) {
System.out.println(iVar1.intValue()); // prints 0.
System.out.println(iVar2); // prints 0.
}
}
OTHER TIPS
It means that iVar
is null. In java, you can't invoke methods on a null reference, it generates the NullPointerException that you are seeing.
private Integer amount=Integer.valueOf(0);
private Integer points=Integer.valueOf(0);
In particular, why you should use Integer.valueOf(int)
instead of new Integer(int): CACHING.
This variant of valueOf
was added in JDK 5 to Byte, Short, Integer, and Long (it already existed in the trivial case in Boolean since JDK 1.4). All of these are, of course, immutable objects in Java. Used to be that if you needed an Integer object from an int, you’d construct a new Integer. But in JDK 5+, you should really use valueOf because Integer now caches Integer objects between -128 and 127 and can hand you back the same exact Integer(0) object every time instead of wasting an object construction on a brand new identical Integer object