Требуется ли проверка 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 falseJLS / 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"); } }