Будет ли 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");
}
}