Требуется ли проверка null перед вызовом instanceof?


будет null instanceof SomeClass return false и NullPointerException?

7 1103

7 ответов:

нет, проверка null не требуется перед использованием instanceof.

выражение x instanceof SomeClass и false если x и null.

из спецификации языка Java, раздел 15.2.2, "тип оператора сравнения instanceof":

"во время выполнения, результат instanceof оператор true если значение RelationalExpression is не null и ссылка может быть бросьте в ReferenceType не поднимая ClassCastException. В противном случае результат false."

поэтому, если операнд равен нулю, результат будет ложным.

использование нулевой ссылки в качестве первого операнда на instanceof возвращает false.

очень хороший вопрос. Я просто попробовал для себя.

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

печать

true
true
false
false

JLS / 15.20.2. Введите оператор сравнения instanceof

во время выполнения, результат instanceof оператор true, если значение RelationalExpression не null и ссылка может быть брошена на ReferenceType без ClassCastException. В противном случае результат false.

API / Class#isInstance (Object)

если это

нет, это не так. instanceof вернутся false если его первый операнд null.

нет. Java literal null не является экземпляром какого-либо класса. Поэтому он не может быть instanceof любой класс. instanceofвернется либо false или true на <referenceVariable> instanceof <SomeClass> возвращает false, когда referenceVariable значение null.

как лакомый кусок:

даже (((A)null)instanceof A) вернутся false.


(если typecasting null кажется удивительным, иногда вам приходится это делать, например в таких ситуациях:

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

так Test.test((A)null) печати a instanceof A: false.)


P. S.: Если вы нанимаете, пожалуйста, не используйте это в качестве вопроса на собеседовании. : D

The instanceof оператор не нуждается в явном null проверяет, как он не бросает NullPointerException если операнд null.

во время выполнения, результат instanceof оператор true, если значение выражения не null и ссылка может быть приведена к ссылочному типу без создания исключения приведения класса.

если операнд null на instanceof возвращает оператор false и, следовательно, явные проверки null не являются требуемый.

рассмотрим приведенный ниже пример,

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

правильное использование instanceof как показано ниже

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