Pertanyaan Apakah cek null diperlukan sebelum memanggil instanceof?


Akan null instanceof SomeClass kembali false atau melempar a NullPointerException?


1085
2018-06-01 13:53


asal


Jawaban:


Tidak, cek null tidak diperlukan sebelum menggunakan instanceof.

Ekspresi x instanceof SomeClass aku s false jika x aku s null.

Dari Spesifikasi Bahasa Jawa, bagian 15.2.2, "Ketik operator perbandingan instanceof":

"Saat run time, hasil dari    instanceof operator adalah true jika   nilai dari RelationalExpression  aku s   tidak null dan referensi bisa   dilemparkan ke ReferenceType   tanpa membesarkan ClassCastException.   Jika tidak, hasilnya adalah false. "

Jadi jika operan itu nol, hasilnya salah.


1453
2018-06-01 14:05



Menggunakan referensi nol sebagai operan pertama instanceof kembali false.


237
2018-06-01 13:53



Pertanyaan yang sangat bagus. Saya hanya mencoba untuk diri saya 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 Perbandingan Operator instanceof

Saat run time, hasil dari instanceof operator adalah true jika nilai dari RelationalExpression tidak null dan referensi bisa dilemparkan ke ReferenceType tanpa membesarkan ClassCastException. Jika tidak, hasilnya adalah false.

API / Class # isInstance (Obyek)

Jika ini Class objek mewakili antarmuka, metode ini mengembalikan true jika kelas atau superclass apa pun yang ditentukan Object argumen mengimplementasikan antarmuka ini; itu kembali false jika tidak. Jika ini Class objek mewakili tipe primitif, metode ini mengembalikan false.


61
2017-07-29 11:55



Tidak, bukan itu. instanceof akan kembali false jika operan pertamanya adalah null.


23
2018-06-01 13:53



Tidak. Java literal null bukan merupakan instance dari kelas apa pun. Karenanya itu tidak bisa menjadi sebuah contoh kelas apa pun. instanceof  akan kembali false atau true oleh karena itu <referenceVariable> instanceof <SomeClass> kembali false kapan referenceVariable nilainya nol.


5
2018-05-27 10:59



Itu instanceof operator tidak perlu eksplisit null cek, karena tidak melempar a NullPointerException jika operan itu null.

Saat run time, hasil dari instanceof operator benar jika nilai dari ekspresi relasional tidak null dan referensi bisa dilemparkan ke tipe referensi tanpa meningkatkan pengecualian cast kelas.

Jika operand itu null, yang instanceof operator kembali false dan karenanya, pemeriksaan null eksplisit tidak diperlukan.

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 dari instanceof 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");
         }  
}

2
2018-04-01 08:09



Sama seperti a berita gembira:

Bahkan (((A)null)instanceof A) akan kembali false.


(Jika typecasting null tampaknya 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.a(null) was called without casting.
    // So you need to call Test.test((A)null) or Test.test((B)null).
  }
}

Begitu Test.test((A)null) akan dicetak a instanceof A: false.)


P.S .: Jika Anda menyewa, tolong jangan gunakan ini sebagai pertanyaan wawancara pekerjaan. : D


2
2018-03-22 12:11