为什么使用默认值的Java整数会导致NullPointerException?
我是Java新手。我刚刚读到Java中的类变量有默认值 我尝试了以下程序,希望得到的输出是为什么使用默认值的Java整数会导致NullPointerException?,java,exception,variables,default-value,nullpointerexception,Java,Exception,Variables,Default Value,Nullpointerexception,我是Java新手。我刚刚读到Java中的类变量有默认值 我尝试了以下程序,希望得到的输出是0,这是整数的默认值,但我得到的是NullPointerException 我错过了什么 class Test{ static Integer iVar; public static void main(String...args) { System.out.println(iVar.intValue()); } } 您是对的,Java中未初始化的类变量具有指定给
0
,这是整数的默认值,但我得到的是NullPointerException
我错过了什么
class Test{
static Integer iVar;
public static void main(String...args) {
System.out.println(iVar.intValue());
}
}
您是对的,Java中未初始化的类变量具有指定给它们的默认值
int
不同Integer
是一个包装类,它将基元类型int
的值包装在一个对象中
在您的例子中,iVar
是对未初始化的整数
对象的引用。未初始化的引用将获得默认值null
,当您尝试对null引用应用intValue
()方法时,将获得NullPointerException
为了完全避免这个问题,您需要将引用变量引用为整数
对象:
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.
}
}
这意味着
iVar
为空。在java中,不能对空引用调用方法,它会生成您看到的NullPointerException
private Integer amount=Integer.valueOf(0);
private Integer points=Integer.valueOf(0);
特别是,为什么要使用Integer.valueOf(int)
而不是新的整数(int):缓存
valueOf
的这个变体在JDK5中被添加到Byte、Short、Integer和Long中(自JDK1.4以来,它已经存在于布尔值的普通情况中)。当然,所有这些在Java中都是不可变的对象。过去,如果需要int中的整数对象,则需要构造一个新的整数。但是在JDK 5+中,您应该真正使用valueOf,因为Integer现在缓存介于-128和127之间的整数对象,并且每次都可以返回相同的整数(0)对象,而不是在一个全新的相同整数对象上浪费对象构造谢谢Coddick。现在有道理了。