Czy należy sprawdzić null przed wywołaniem instanceof?

Czy null instanceof SomeClass zwróci false Czy rzuci NullPointerException?

Author: Josh Caswell, 2010-06-01

7 answers

Nie, sprawdzenie null nie jest konieczne przed użyciem instanceof.

Wyrażenie x instanceof SomeClass jest false Jeśli x jest null.

Ze specyfikacji języka Java, sekcja 15.2.2, "Typ comparison operator instanceof":

" w czasie wykonywania, wynik instanceof operatorem jest true jeśli wartość relacji na nie null a referencją może być cast to the ReferenceType bez podnoszenia ClassCastException. W przeciwnym razie wynikiem jest false."

Więc jeśli operand jest null, wynik jest false.

 1491
Author: Andy Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 21:12:03

Użycie referencji null jako pierwszego operandu instanceof zwraca false.

 240
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 16:56:33

Bardzo dobre pytanie. Próbowałem tylko dla siebie.

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));
    }
}

Druki

true
true
false
false

JLS / 15.20.2. Operator porównania typów instanceof

W czasie wykonywania, wynikiem operatora instanceof jest true, Jeśli wartość RelationalExpression nie jest null, A odniesienie może być rzucone na ReferenceType bez podnoszenia ClassCastException. W przeciwnym razie wynikiem jest false.

API / Class#isInstance(Object)

Jeśli obiekt Class reprezentuje interfejs, metoda ta zwraca true jeśli klasa lub jakakolwiek Klasa nadrzędna podanego argumentu Object implementuje ten interfejs; zwraca false w przeciwnym razie. Jeśli obiekt Class reprezentuje typ prymitywny, metoda ta zwraca false.

 61
Author: Jin Kwon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-22 03:27:02

Nie, Nie jest. instanceof zwróci false, jeśli jego pierwszym operandem jest null.

 24
Author: RoflcoptrException,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-21 10:49:10

Nie . Literał Javy null nie jest instancją żadnej klasy. Dlatego nie może być instanceof dowolne zajęcia. instanceof zwróci false lub true dlatego <referenceVariable> instanceof <SomeClass> zwraca false, Gdy referenceVariable wartość jest null.

 6
Author: Willmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-28 13:55:49

Tak jak tidbit :

Nawet (((A)null)instanceof A) powróci false.


(Jeśli typecasting null wydaje się zaskakujący, czasami trzeba to zrobić, na przykład w takich sytuacjach:

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).
  }
}

Więc Test.test((A)null) wydrukuje a instanceof A: false.)


P. S.: jeśli zatrudniasz, nie używaj tego jako pytania na rozmowę kwalifikacyjną. : D

 3
Author: Attila Tanyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-21 07:10:15

Operator instanceof nie wymaga jawnych sprawdzeń null, ponieważ nie rzuca NullPointerException, Jeśli operand jest null.

W czasie wykonywania, wynik operatora instanceof jest prawdziwy, jeśli wartość wyrażenia relacyjnego nie jest null i odniesienie może być rzucone na typ odniesienia bez podnoszenia wyjątku Cast klasy.

Jeśli operandem jest null, operator instanceof zwraca false, a zatem jawne sprawdzanie null nie jest wymagane.

Rozważ poniższe przykład,

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

Poprawne użycie instanceof jest jak pokazano poniżej,

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
Author: Nikhil Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-21 09:45:47