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