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