web-dev-qa-db-ja.com

デフォルト値のJava Integerを使用すると、NullPointerExceptionが発生するのはなぜですか?

私はJavaを初めて使用します。 Javaのクラス変数にはデフォルト値があることを読みました。

次のプログラムを試してみたところ、整数のデフォルト値である0として出力を取得することを期待していましたが、NullPointerExceptionを取得しました。

何が足りないのですか?

class Test{
    static Integer iVar;

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

そうです、Javaの初期化されていないクラス変数にはデフォルト値が割り当てられています。Integerタイプ入力JavaはintIntegerは、プリミティブ型intの値をオブジェクトにラップするラッパークラスです。

あなたの場合、iVarは、初期化されていないIntegerオブジェクトへの参照です。初期化されていない参照はデフォルト値のnullを取得し、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.
 }
}
28
codaddict

これは、iVarがnullであることを意味します。 Javaでは、null参照でメソッドを呼び出すことはできません。これにより、表示されているNullPointerExceptionが生成されます。

1
Jason Coco
_private Integer amount=Integer.valueOf(0);
private Integer points=Integer.valueOf(0);
_

特に、new Integer(int)の代わりにInteger.valueOf(int)を使用する必要がある理由:CACHING。

valueOfのこのバリアントは、JDK 5でバイト、ショート、整数、およびロングに追加されました(JDK 1.4以降、ブール値の些細なケースですでに存在していました)。もちろん、これらはすべてJavaの不変オブジェクトです。以前は、intからIntegerオブジェクトが必要な場合は、新しいIntegerを作成していました。ただし、JDK 5以降では、Integerが-128〜127のIntegerオブジェクトをキャッシュし、まったく新しい同一のIntegerオブジェクトのオブジェクト構築を無駄にする代わりに、毎回同じ正確なInteger(0)オブジェクトを返すことができるため、実際にはvalueOfを使用する必要があります。

0