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 の type は と同じではありませんint。プリミティブ型の値をオブジェクトIntegerにラップするラッパークラスです。int

あなたの場合、初期化されていないオブジェクトiVarへの参照です。Integer初期化されていない参照は のデフォルト値を取得し、null 参照に () メソッドnullを適用しようとすると、 . intValueNullPointerException

この問題を完全に回避するには、参照変数が次のように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 では、null 参照でメソッドを呼び出すことはできません。表示されている 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(0) オブジェクトを返すことができるためです。

于 2019-08-05T13:58:18.647 に答える