Нужна ли нулевая проверка перед вызовом instanceof?
Будет ли null instanceof SomeClass
возвращать false
или выбросить NullPointerException
?
Ответы
Ответ 1
Нет, нулевая проверка не требуется перед использованием instanceof.
Выражение x instanceof SomeClass
имеет значение false
если x
равно null
.
Из спецификации языка Java, раздел 15.20.2, "Оператор сравнения типов instanceof":
"Во время выполнения результат оператора instanceof
равен true
если значение RelationalExpression не равно null
и ссылка может быть приведена к ReferenceType без повышения ClassCastException
. В противном случае результат равен false
".
Так что, если операнд нулевой, результат ложный.
Ответ 2
Использование нулевой ссылки в качестве первого операнда для instanceof
возвращает false
.
Ответ 3
Очень хороший вопрос. Я просто пробовал для себя.
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
.
Ответ 4
Нет, нет. instanceof
вернет false
, если его первый операнд null
.
Ответ 5
Нет Java буквальный null
не является экземпляром какого-либо класса. Поэтому он не может быть экземпляром какого-либо класса. instanceof
вернет либо false
либо true
поэтому <referenceVariable> instanceof <SomeClass>
возвращает false
если значение referenceVariable
равно нулю.
Ответ 6
Просто как лакомый кусочек:
Even (
((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
.)
PS: Если вы нанимаете, пожалуйста, не используйте это как вопрос собеседования. : D
Ответ 7
Оператор instanceof
не нуждается в явных проверках null
, так как он не бросает NullPointerException
, если операнд null
.
Во время выполнения результат оператора instanceof
является истинным, если значение реляционного выражения не является 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");
}
}