Jawaban:
Anda dapat menggunakan null
tipe referensi apa pun tanpa mendapatkan pengecualian.
The println
metode tidak membuang nol pointer karena cek dulu apakah objek tersebut adalah null atau tidak. Jika null maka itu hanya mencetak string "null"
. Kalau tidak, ia akan memanggil toString
metode objek itu.
Menambahkan rincian lebih lanjut: Metode pencetakan metode panggilan internal String.valueOf(object)
pada objek input. Dan dalam valueOf
metode, pemeriksaan ini membantu menghindari pengecualian null pointer:
return (obj == null) ? "null" : obj.toString();
Untuk sisa kebingungan Anda, memanggil metode apa pun pada objek nol harus membuang pengecualian pointer nol, jika bukan kasus khusus.
Anda dapat menggunakan null
tipe referensi apa pun. Anda juga dapat memanggil metode yang menangani null
sebagai argumen, misalnya System.out.println(Object)
, tetapi Anda tidak bisa mereferensikan null
nilai dan memanggil metode.
BTW Ada situasi sulit di mana Anda bisa memanggil metode statis pada null
nilai.
Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.
t.yield() -> Thread.yeld()
? Mirip dengan bagaimana final int i = 1; while (i == 1)
dioptimalkan untukwhile(true)
Ini dengan desain. Anda dapat menggunakan null
tipe referensi apa pun. Kalau tidak, Anda tidak akan dapat menetapkannya ke variabel referensi.
Casting nilai null diperlukan untuk mengikuti konstruksi di mana metode kelebihan beban dan jika nol dilewatkan ke metode kelebihan beban ini maka kompiler tidak tahu cara menghapus ambiguitas maka kita perlu mengetikkan nol dalam kasus ini:
class A {
public void foo(Long l) {
// do something with l
}
public void foo(String s) {
// do something with s
}
}
new A().foo((String)null);
new A().foo((Long)null);
Kalau tidak, Anda tidak dapat memanggil metode yang Anda butuhkan.
String bar = null;
melemparkan null
nilai ke String
. Sejauh ini saya hanya perlu memberikan null secara eksplisit dalam tes di mana metode kelebihan beban dan saya ingin menguji perilakunya dengan input nol. Namun, baik untuk mengetahui, saya akan menulis jawaban yang sama sebelum saya menemukan jawaban Anda.
l instanceof Long
dan s instanceof String
akan kembali false
dalam kasus ini.
Banyak jawaban di sini sudah disebutkan
Anda dapat menggunakan nol untuk semua jenis referensi
dan
Jika argumennya nol, maka sebuah string sama dengan "null"
Saya bertanya-tanya di mana itu ditentukan dan mencarinya di Spesifikasi Java:
Jika referensi adalah nol, itu dikonversi ke string "null" (empat karakter ASCII n, u, l, l).
Seperti yang ditulis orang lain, Anda dapat membatalkan semua hal. Biasanya, Anda tidak membutuhkan itu, Anda dapat menulis:
String nullString = null;
tanpa meletakkan gips di sana.
Tetapi ada saat-saat di mana pemain seperti itu masuk akal:
a) jika Anda ingin memastikan bahwa metode tertentu dipanggil, seperti:
void foo(String bar) { ... }
void foo(Object bar) { ... }
maka itu akan membuat perbedaan jika Anda mengetik
foo((String) null) vs. foo(null)
b) jika Anda bermaksud menggunakan IDE untuk menghasilkan kode; misalnya saya biasanya menulis tes unit seperti:
@Test(expected=NullPointerException.class)
public testCtorWithNullWhatever() {
new MyClassUnderTest((Whatever) null);
}
Saya sedang melakukan TDD; ini berarti bahwa kelas "MyClassUnderTest" mungkin belum ada. Dengan menuliskan kode itu, saya kemudian dapat menggunakan IDE saya untuk pertama-tama menghasilkan kelas baru; dan kemudian menghasilkan konstruktor yang menerima argumen "Apa pun" "di luar kotak" - IDE dapat memperkirakan dari pengujian saya bahwa konstruktor harus mengambil tepat satu argumen dari tipe Apa pun.
Cetak :
Cetak objek. String yang dihasilkan oleh metode String.valueOf (Object) diterjemahkan ke dalam byte
jika argumennya nol, maka sebuah string sama dengan "null"; jika tidak, nilai obj.toString () dikembalikan.
Itu hanya akan mengembalikan string dengan nilai "null" ketika objek tersebut null
.
Ini sangat berguna ketika menggunakan metode yang seharusnya tidak jelas. Sebagai contoh: JDialog memiliki konstruktor dengan tanda tangan berikut:
JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)
Saya perlu menggunakan konstruktor ini, karena saya ingin mengatur GraphicsConfiguration, tetapi saya tidak memiliki orang tua untuk dialog ini, jadi argumen pertama harus nol. Menggunakan
JDialog(null, String, boolean, Graphicsconfiguration)
ambigu, jadi dalam hal ini saya dapat mempersempit panggilan dengan memberikan null ke salah satu jenis yang didukung:
JDialog((Frame) null, String, boolean, GraphicsConfiguration)
Fitur bahasa ini nyaman dalam situasi ini.
public String getName() {
return (String) memberHashMap.get("Name");
}
Jika memberHashMap.get ("Name") mengembalikan null, Anda tetap menginginkan metode di atas mengembalikan null tanpa melempar pengecualian. Tidak peduli apa kelasnya, nol adalah nol.