16

Нужна ли проверка на null перед вызовом instanceof?

10

Возникла проблема с использованием оператора `instanceof` в Java. Интересно, вернет ли выражение null instanceof SomeClass значение false или вызовет NullPointerException? Буду признателен за объяснение поведения данного выражения.

5 ответ(ов)

3

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

В Java оператор instanceof проверяет, является ли объект экземпляром определенного класса или интерфейса. Если первый операнд является null, то результат всегда будет false, независимо от того, какой класс или интерфейс указан после оператора. Это связано с тем, что null не является экземпляром ни одного класса. Вот пример:

String str = null;
boolean result = str instanceof String; // результат будет false

Таким образом, если вы хотите проверить, является ли объект экземпляром какого-либо класса, сначала нужно убедиться, что он не равен null.

0

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

0

Вот небольшой факт:

Даже выражение ((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) {
    // Переопределенная версия. Это вызовет неоднозначность ссылки (ошибка компиляции)
    // если вызвать Test.test(null) без приведения.
    // Поэтому необходимо вызывать Test.test((A)null) или Test.test((B)null).
  }
}

Таким образом, Test.test((A)null) выведет a instanceof A: false.)


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

0

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

Также, если проверка instanceof возвращает true, тип переменной уже проверен, и вы можете безопасно приводить её к нужному типу без дополнительных проверок на null. Таким образом, проверка на null после instanceof, которая уже вернула true, также не требуется.

Примеры null-безопасного кода:

if (couldbenull instanceof Comparable comp) {
    return comp.compareTo(somethingElse);
}
// для Java < 14
if (couldbenull instanceof Comparable) {
    return ((Comparable) couldbenull).compareTo(somethingElse);
}

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

0

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

На этапе выполнения оператор instanceof возвращает true, если значение проверяемого выражения не равно null и ссылку можно привести к нужному типу без выбрасывания исключения ClassCastException.

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

Рассмотрим следующий пример:

public static void main(String[] args) {
    if(lista != null && lista instanceof ArrayList) { // Нарушение
        System.out.println("Внутри if блока");
    } else {
        System.out.println("Внутри else блока");
    }
}

Правильное использование оператора instanceof выглядит так:

public static void main(String[] args) {
    if(lista instanceof ArrayList) { // Правильный способ
        System.out.println("Внутри if блока");
    } else {
        System.out.println("Внутри else блока");
    }  
}

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь