なぜ、NullPointerExceptionが発生してデフォルト値のJava整数の結果を使用していますか?

StackOverflow https://stackoverflow.com/questions/2437603

質問

私は、Javaに新しいです。私はJavaでそのクラス変数はデフォルト値を持って読んでます。

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

私は何をしないのですか?

class Test{
    static Integer iVar;

    public static void main(String...args) {
        System.out.println(iVar.intValue());
    }
}
役に立ちましたか?

解決

あなたは正しいです、Javaで初期化されていないクラス変数は、それらに割り当てられたデフォルト値を持っています。 JavaでIntegerタイプはintと同じではありません。 Integerは、オブジェクト内のプリミティブ型intの値をラップするラッパークラスです。

あなたのケースではiVarはinitiliazedされていない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);

特に、なぜあなたは、代わりに新しい整数(int型)のInteger.valueOf(int)を使用する必要があります。CACHING

valueOfのこの変異体は、(それが既にJDK 1.4以降のブールでの些細な場合には存在していた)Byte、Short、Integer、およびLongにJDK 5で追加されました。これらのすべては、もちろん、Javaで不変オブジェクトです。あなたはint型からIntegerオブジェクトを必要に応じて、あなたは新しい整数を構築したいことをするために使用します。整数(0)ブランドの新しい、同一のIntegerオブジェクトにオブジェクトの構築を無駄にするのではなく、毎回オブジェクトと同じ正確な整数を今-128から127の間でIntegerオブジェクトをキャッシュバックあなたを渡すことができるので、しかし、JDKで5+、あなたは本当にのvalueOfを使用する必要があります

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top