私は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
を取得し、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
がnullであることを意味します。 Javaでは、null参照でメソッドを呼び出すことはできません。これにより、表示されているNullPointerExceptionが生成されます。
_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を使用する必要があります。