19

我是 Java 新手。我刚刚读到Java中的类变量具有默认值。

我尝试了以下程序,并期望得到输出0,这是整数的默认值,但我得到了NullPointerException.

我错过了什么?

class Test{
    static Integer iVar;

    public static void main(String...args) {
        System.out.println(iVar.intValue());
    }
}
4

3 回答 3

31

你是对的,Java 中未初始化的类变量具有分配给它们的默认值。IntegerJava 中的类型与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.
 }
}
于 2010-03-13T07:15:19.317 回答
1

这意味着它iVar是空的。在 java 中,您不能在空引用上调用方法,它会生成您所看到的 NullPointerException。

于 2010-03-13T07:16:19.573 回答
0
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 对象上浪费对象构造

于 2019-08-05T13:58:18.647 回答