クラスキャストではなくヌルポインターを使用する理由


26

Javaの場合:

int count = (Integer) null;

java.lang.NullPointerExceptionをスローします。

プログラマーの理解を容易にするために、なぜこれがクラスキャスト例外をスローしないのですか?

この例外が他の例外よりも選ばれたのはなぜですか?

回答:


46

コードを実行すると、Javaランタイムは次のことを行います。

  1. クラスIntegerのオブジェクトにnullをキャストします。
  2. メソッドintValue()を呼び出して、整数オブジェクトをintにアンボックスしてみてください。
  3. nullオブジェクトのメソッドを呼び出すと、NullPointerExceptionがスローされます。

つまり、nullは問題なくIntegerにキャストできますが、null整数オブジェクトはint型の値に変換できません。

編集

少し前にStack Overflowで関連する質問がありましたこちらをご覧ください


1

Javaは、オブジェクトを参照しない整数参照にnullを正常にキャストします。

それは問題ありません。なぜなら、検証されていないということは、参照にとって有効な状態だからです。

実行できないのは、存在しないオブジェクトのメソッドの呼び出しです。

キャストの実行は(Integer)null、整数変数を宣言してから、新しい(または既存の)整数オブジェクトインスタンスの割り当てに失敗することと同じです。


-1

Integeraをintie inにunboxするにはint i = new Integer(15);i実際に等しいnew Integer(15).intValue() i = (Integer) o; where Object o = 15o = Integer.valueOf(15);but と同じi = nullです。がスローされるのは、どちらがスローするNullPointerExceptioniに等しいためです 。null.intValue()NullPointerException


2
ほぼ2年前に受け入れられた答えは、ほぼ同じ説明を提供しますが、より明確です。この回答はJava 5+でも正しくありません。現在valueOf()、ボクシング用の新しいインスタンスを作成するのではなく、ファクトリメソッドを使用しています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.