Akan null instanceof SomeClass
kembali false
atau melempar NullPointerException
?
Akan null instanceof SomeClass
kembali false
atau melempar NullPointerException
?
Jawaban:
Tidak, pemeriksaan nol tidak diperlukan sebelum menggunakan instanceof.
Ekspresi x instanceof SomeClass
adalah false
jika x
ini null
.
Dari Spesifikasi Bahasa Jawa, bagian 15.20.2, "Ketikkan instance operator perbandingan" :
"Pada saat run time, hasil dari
instanceof
operator adalahtrue
jika nilai RelationalExpression tidaknull
dan referensi dapat dilemparkan ke ReferenceType tanpa menaikkan aClassCastException
. Kalau tidak hasilnya hasilnyafalse
."
Jadi jika operan adalah nol, hasilnya salah.
try it
karena perilaku saat ini tidak sama dengan perilaku yang dijamin .
Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceof
adalah bagian dari Java 1.0, dirilis hampir 20 tahun yang lalu. Mengubah perilaku sekarang dengan cara yang akan merusak kode yang ada tidak mungkin, tidak ada manfaat yang melebihi biaya yang sangat besar. Dua puluh tahun yang lalu, mungkin ada argumen untuk mengembalikan true jika argumen itu bisa dilemparkan, atau melemparkan pengecualian untuk argumen nol. Tetapi definisi-definisi itu akan membutuhkan pemeriksaan nol yang terpisah.
Pertanyaan yang sangat bagus. Saya hanya mencoba sendiri.
public class IsInstanceOfTest {
public static void main(final String[] args) {
String s;
s = "";
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
s = null;
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
}
}
Cetakan
true
true
false
false
JLS / 15.20.2. Ketik Contoh Operator Perbandingan
Pada saat run time, hasil dari
instanceof
operator adalahtrue
jika nilai RelationalExpression tidaknull
dan referensi dapat dilemparkan ke ReferenceType tanpa menaikkan aClassCastException
. Kalau tidak hasilnya adalahfalse
.
API / Kelas # isInstance (Object)
Jika
Class
objek ini mewakili antarmuka, metode ini mengembalikantrue
jika kelas atau superclass dariObject
argumen yang ditentukan mengimplementasikan antarmuka ini; ia mengembalikanfalse
sebaliknya. JikaClass
objek ini mewakili tipe primitif, metode ini kembalifalse
.
s
hanyalah variabel referensi objek. Ini dapat merujuk objek yang sebenarnya ada ( ""
) atau merujuk null
referensi (yang) literal.
null
bukan data string, apa pun variabel yang menunjukkannya. s instanceof String
tidak sama dengan field.getType().equals(String.class)
, misalnya.
s instanceof String
tersebut s
akan diganti dengan nilai yang sebenarnya, sehingga akan menjadi "" instanceof String
dan null instanceof String
. Memikirkannya seperti ini mungkin lebih masuk akal.
Tidak, tidak. instanceof
akan kembali false
jika operan pertamanya adalah null
.
Sama seperti berita gembira :
Bahkan akan kembali .(
((A)null)
instanceof A)
false
(Jika pengetikan null
tampak mengejutkan, terkadang Anda harus melakukannya, misalnya dalam situasi seperti ini:
public class Test
{
public static void test(A a)
{
System.out.println("a instanceof A: " + (a instanceof A));
}
public static void test(B b) {
// Overloaded version. Would cause reference ambiguity (compile error)
// if Test.test(null) was called without casting.
// So you need to call Test.test((A)null) or Test.test((B)null).
}
}
Jadi Test.test((A)null)
akan dicetak a instanceof A: false
.)
PS: Jika Anda sedang merekrut, jangan gunakan ini sebagai pertanyaan wawancara kerja. : D
Tidak ada . Java literal null
bukan turunan dari kelas mana pun. Oleh karena itu tidak dapat menjadi instance dari kelas mana pun. instanceof
akan mengembalikan salah satu false
atautrue
karena itu <referenceVariable> instanceof <SomeClass>
pengembalian false
ketika referenceVariable
nilai nol.
The instanceof
operator tidak perlu eksplisit null
cek, karena tidak melempar NullPointerException
jika operan adalah null
.
Pada saat run time, hasil dari instanceof
operator adalah benar jika nilai ekspresi relasional tidak null
dan referensi dapat dilemparkan ke tipe referensi tanpa menaikkan pengecualian pemeran kelas.
Jika operan null
, instanceof
operator kembali false
dan karenanya, tidak diperlukan pemeriksaan eksplisit.
Perhatikan contoh di bawah ini,
public static void main(String[] args) {
if(lista != null && lista instanceof ArrayList) { //Violation
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}
Penggunaan yang benar instanceof
adalah seperti yang ditunjukkan di bawah ini,
public static void main(String[] args) {
if(lista instanceof ArrayList){ //Correct way
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}