Mengapa null pointer bukan pemeran kelas?

26

Di Jawa:

int count = (Integer) null;

melempar java.lang.NullPointerException.

Mengapa ini tidak membuang Pengecualian Kelas untuk memudahkan pemahaman programmer?

Mengapa pengecualian ini dipilih daripada pengecualian lainnya?

Nathan R
sumber

Jawaban:

46

Saat menjalankan kode Anda, Java runtime melakukan hal berikut:

  1. Buang nol ke objek Integer kelas.
  2. Cobalah untuk membuka kotak objek Integer ke int dengan memanggil metode intValue ()
  3. Memanggil metode pada objek nol melempar NullPointerException.

Dengan kata lain, null dapat dilemparkan ke Integer tanpa masalah, tetapi objek integer nol tidak dapat dikonversi ke nilai tipe int.

EDIT

Saya punya pertanyaan terkait beberapa waktu lalu di Stack Overflow, lihat di sini .

Giorgio
sumber
1

Java berhasil memberikan null ke referensi Integer yang tidak merujuk objek.

Tidak apa-apa karena tidak dibuktikan kebenarannya adalah keadaan untuk referensi.

Itu adalah panggilan metode metode objek yang tidak ada yang tidak dapat dilakukan.

Melakukan pemeran (Integer)nullsama dengan mendeklarasikan variabel Integer dan kemudian gagal menetapkannya objek instance integer baru (atau yang sudah ada).

Tulains Córdova
sumber
-1

Untuk membuka kotak a Integerke dalam intyaitu int i = new Integer(15);, isebenarnya sama dengan new Integer(15).intValue() i = (Integer) o; di mana Object o = 15sama dengan o = Integer.valueOf(15);tetapi i = null; melempar NullPointerExceptionkarena ikemudian sama dengan null.intValue()melempar NullPointerException.

JavaProdigy
sumber
2
Jawaban yang diterima hampir dua tahun lalu memberikan penjelasan yang hampir sama, tetapi lebih jelas. Jawaban ini juga tidak benar untuk Java 5+: sekarang menggunakan valueOf()metode pabrik daripada membuat contoh baru untuk tinju.