Буде чи null instanceof SomeClass
повернутися false
або кинути NullPointerException
?
Буде чи null instanceof SomeClass
повернутися false
або кинути NullPointerException
?
Відповіді:
Ні, нульова перевірка не потрібна перед використанням instanceof.
Вираз x instanceof SomeClass
є, false
якщо x
є null
.
З специфікації мови Java, розділ 15.20.2, "Тип оператора порівняння екземпляраofof" :
"Під час виконання результатом
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
оператор є,true
якщо значення RelationalExpression не єnull
і посилання може бути передане на ReferenceType без підвищення aClassCastException
. Інакше результат єfalse
.
API / клас # isInstance (об’єкт)
Якщо цей
Class
об'єкт представляє інтерфейс, цей метод повертається,true
якщо клас або будь-який надклас вказаногоObject
аргументу реалізує цей інтерфейс; він повертаєтьсяfalse
інакше. Якщо цейClass
об'єкт являє собою примітивний тип, цей метод повертаєтьсяfalse
.
s
- просто змінна посилання на об'єкт. Він може посилатися на фактично існуючий об'єкт ( ""
) або може посилатися на (the) null
буквальне посилання.
null
не є рядковими даними, незалежно від того, яка змінна вказує на нього. s instanceof String
не те саме, що field.getType().equals(String.class)
, наприклад.
s instanceof String
команда get 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 literal null
не є примірником жодного класу. Тому він не може бути екземпляром жодного класу. instanceof
повертає або, false
абоtrue
тому <referenceVariable> instanceof <SomeClass>
повертає, false
коли referenceVariable
значення є нульовим.
instanceof
Оператор не потребує в явних null
перевірок, так як він не кидати , NullPointerException
якщо операнд null
.
Під час виконання результат instanceof
оператора є істинним, якщо значення реляційного вираження відсутнє 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");
}
}