Будет ли null instanceof SomeClassвернуться falseили бросить NullPointerException?
Будет ли null instanceof SomeClassвернуться falseили бросить NullPointerException?
Ответы:
Нет, проверка нуля не требуется перед использованием instanceof.
Выражение x instanceof SomeClassэто , falseесли xесть null.
Из спецификации языка Java, раздел 15.20.2, «Оператор сравнения типов instanceof» :
«Во время выполнения результат
instanceofоператора -trueесли значение RelationalExpression отсутствует,nullи ссылка может быть приведена к ReferenceType без повышенияClassCastException. В противном случае результат будетfalse».
Так что, если операнд равен нулю, результат ложен.
try itчто текущее поведение не совпадает с гарантированным поведением .
Effective Java- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceofоператор Java был частью Java 1.0, выпущенной почти 20 лет назад. Изменение поведения таким образом, что это нарушит существующий код, маловероятно, если не будет некоторой выгоды, которая перевешивает эту огромную стоимость. Двадцать лет назад, возможно, могли быть аргументы для возврата истины, если аргумент мог быть приведен, или для исключения нулевого аргумента. Но эти определения потребовали бы отдельных нулевых проверок.
Очень хороший вопрос. Я просто попробовал для себя.
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 без вызова aClassCastException. В противном случае результатfalse.
API / Class # isInstance (Объект)
Если этот
Classобъект представляет интерфейс, этот метод возвращает,trueесли класс или любой суперкласс указанногоObjectаргумента реализует этот интерфейс; это возвращаетсяfalseиначе. Если этотClassобъект представляет примитивный тип, этот метод возвращаетfalse.
s- это просто ссылка на объект. Он может ссылаться на реально существующий объект ( "") или может ссылаться на () nullбуквальную ссылку.
nullне строковые данные, независимо от того, какая переменная указывает на них. s instanceof Stringэто не то же самое, что field.getType().equals(String.class), например.
s instanceof Stringпроисходит sзамена на фактическое значение, так что это станет "" instanceof Stringи null instanceof String. Думая об этом, как это может иметь больше смысла.
Нет, это не так. 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) {
// 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
Нет . Java-литерал nullне является экземпляром какого-либо класса. Поэтому он не может быть экземпляром какого-либо класса. instanceof вернет либо falseили,true следовательно, <referenceVariable> instanceof <SomeClass>возвращает, falseкогда referenceVariableзначение равно нулю.
instanceofОператор не нуждается в явных nullпроверок, так как он не бросать , NullPointerExceptionесли операнд null.
Во время выполнения результат instanceofоператора равен true, если значение реляционного выражения не равно nullи ссылка может быть приведена к ссылочному типу без вызова исключения преобразования класса.
Если операнд есть null, instanceofоператор возвращается falseи, следовательно, явные проверки на ноль не требуются.
Рассмотрим приведенный ниже пример,
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");
}
}