我是 Java 新手。我刚刚读到Java中的类变量具有默认值。
我尝试了以下程序,并期望得到输出0
,这是整数的默认值,但我得到了NullPointerException
.
我错过了什么?
class Test{
static Integer iVar;
public static void main(String...args) {
System.out.println(iVar.intValue());
}
}
我是 Java 新手。我刚刚读到Java中的类变量具有默认值。
我尝试了以下程序,并期望得到输出0
,这是整数的默认值,但我得到了NullPointerException
.
我错过了什么?
class Test{
static Integer iVar;
public static void main(String...args) {
System.out.println(iVar.intValue());
}
}
你是对的,Java 中未初始化的类变量具有分配给它们的默认值。Integer
Java 中的类型与int
. Integer
是将原始类型的值包装在对象中的包装类int
。
在您的情况下iVar
,是对Integer
尚未初始化的对象的引用。未初始化的引用获得默认值,null
当您尝试对intValue
空引用应用 () 方法时,您将获得NullPointerException
.
为了完全避免这个问题,你需要让你的引用变量引用一个Integer
对象:
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)
而不是 new Integer(int): CACHING。
这个变体valueOf
在 JDK 5 中被添加到 Byte、Short、Integer 和 Long(自 JDK 1.4 以来它已经存在于 Boolean 中的琐碎案例中)。当然,所有这些都是 Java 中的不可变对象。过去,如果您需要来自 int 的 Integer 对象,您将构造一个新的 Integer。但是在 JDK 5+ 中,您应该真正使用 valueOf 因为 Integer 现在缓存 -128 和 127 之间的 Integer 对象,并且每次都可以将相同的 Integer(0) 对象返回给您,而不是在全新的相同 Integer 对象上浪费对象构造