Нужна ли нулевая проверка перед вызовом instanceof? - PullRequest
1220 голосов
/ 01 июня 2010

Будет null instanceof SomeClass вернуть false или бросить NullPointerException?

Ответы [ 7 ]

1662 голосов
/ 01 июня 2010

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

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

Из спецификации языка Java, , раздел 15.20.2, «Оператор сравнения типов instanceof»:

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

Так что, если операнд равен нулю,результат ложный.

255 голосов
/ 01 июня 2010

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

69 голосов
/ 29 июля 2013

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

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)

Если этот объект Class представляет интерфейс, этот метод возвращает true, если класс или любой суперкласс указанного аргумента Object реализует этот интерфейс; в противном случае возвращается false. Если этот Class объект представляет примитивный тип, этот метод возвращает false.

24 голосов
/ 01 июня 2010

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

7 голосов
/ 22 марта 2018

Так же, как лакомый кусочек :

Четный (((A)null)instanceof A) вернет false.


(Если приведение типов 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

6 голосов
/ 27 мая 2016

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

1 голос
/ 01 апреля 2015

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

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

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

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

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");
         }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...