Требуется ли проверка null перед вызовом instanceof?
будет null instanceof SomeClass
return false
и NullPointerException
?
7 ответов
нет, проверка null не требуется перед использованием instanceof.
выражение x instanceof SomeClass
is false
если x
и null
.
из спецификации языка Java, раздел 15.2.2, "тип оператора сравнения instanceof":
"во время выполнения, результат
instanceof
операторtrue
если значение RelationalExpression is неnull
а ссылку можно бросьте в ReferenceType не поднимая аClassCastException
. В противном случае результатfalse
."
поэтому, если операнд равен null, результат будет 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)
если это
нет. 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
на 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");
}
}