Нужна ли проверка на null перед вызовом instanceof?
Возникла проблема с использованием оператора `instanceof` в Java. Интересно, вернет ли выражение null instanceof SomeClass
значение false
или вызовет NullPointerException
? Буду признателен за объяснение поведения данного выражения.
5 ответ(ов)
Использование нулевой ссылки в качестве первого операнда для оператора instanceof
возвращает false
.
В Java оператор instanceof
проверяет, является ли объект экземпляром определенного класса или интерфейса. Если первый операнд является null
, то результат всегда будет false
, независимо от того, какой класс или интерфейс указан после оператора. Это связано с тем, что null
не является экземпляром ни одного класса. Вот пример:
String str = null;
boolean result = str instanceof String; // результат будет false
Таким образом, если вы хотите проверить, является ли объект экземпляром какого-либо класса, сначала нужно убедиться, что он не равен null
.
Нет, это не так. Оператор instanceof
вернёт false
, если его первый операнд равен null
.
Вот небольшой факт:
Даже выражение ((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.: Если вы проводите собеседование, пожалуйста, не используйте это как вопрос на интервью. 😄
В 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
значениях.
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
, чтобы избежать избыточного кода.
Почему поле с @Autowired в Spring оказывается null?
Что значит "Не удалось найти или загрузить основной класс"?
Как установить Java 8 на Mac
Почему в RecyclerView отсутствует onItemClickListener()?
Что значит 'synchronized'?