Będzie null instanceof SomeClasspowrotu falselub rzucić NullPointerException?
Będzie null instanceof SomeClasspowrotu falselub rzucić NullPointerException?
Odpowiedzi:
Nie, sprawdzanie wartości zerowej nie jest konieczne przed użyciem instanceof.
Wyrażenie x instanceof SomeClassto falsejeśli xjest null.
Ze specyfikacji języka Java, sekcja 15.20.2, „Instancja operatora porównania typów” :
„W czasie wykonywania wynikiem działania
instanceofoperatora jest to,trueczy wartość RelationalExpression nie jest,nulla odwołanie może być rzutowane na ReferenceType bez podnoszenia aClassCastException. W przeciwnym razie wynik jestfalse.”
Jeśli więc argument jest pusty, wynik jest fałszywy.
try itdlatego, że obecne zachowanie nie jest tym samym, co zachowanie gwarantowane .
Effective Java- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceofoperator Javy był częścią Java 1.0, wydanej prawie 20 lat temu. Zmiana zachowania teraz w sposób, który zniszczyłby istniejący kod, jest mało prawdopodobna, ponieważ nie przynosi korzyści przewyższających tak ogromne koszty. Dwadzieścia lat temu być może istniałyby argumenty za zwróceniem prawdziwego, jeśli argument mógłby zostać rzucony, lub wprowadzenie wyjątku dla argumentu zerowego. Ale te definicje wymagałyby osobnych kontroli zerowych.
Rzeczywiście bardzo dobre pytanie. Właśnie próbowałem dla siebie.
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));
}
}
Wydruki
true
true
false
false
JLS / 15.20.2. Porównanie typów Operator instanceof
W czasie wykonywania wynik
instanceofoperatora jesttruetaki, że wartość RelationalExpression nie jest,nulla odwołanie może być rzutowane na ReferenceType bez podnoszenia aClassCastException. W przeciwnym razie wynik jestfalse.
API / Class # isInstance (Object)
Jeśli ten
Classobiekt reprezentuje interfejs, ta metoda zwraca,truejeśli klasa lub jakakolwiek nadklasa określonegoObjectargumentu implementuje ten interfejs; zwracafalseinaczej. Jeśli tenClassobiekt reprezentuje typ pierwotny, ta metoda zwracafalse.
sjest tylko zmienną odwołania do obiektu. Może odwoływać się do faktycznie istniejącego obiektu ( "") lub może odnosić się do nulldosłownego odwołania.
nullnie jest ciągiem danych, bez względu na to, która zmienna na to wskazuje. s instanceof Stringto nie to samo, co field.getType().equals(String.class)na przykład.
s instanceof Strings"" instanceof Stringnull instanceof String
Nie, nie jest. instanceofzwróci, falsejeśli jest to pierwszy argument operacji null.
Tak jak smakołyk :
Nawet wróci .(((A)null)instanceof A)false
(Jeśli rzutowanie nullwydaje się zaskakujące, czasami musisz to zrobić, na przykład w sytuacjach takich jak ta:
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).
}
}
Więc Test.test((A)null)wydrukuję a instanceof A: false.)
PS: Jeśli zatrudniasz, nie używaj tego jako pytania do rozmowy kwalifikacyjnej. :RE
Nie . Literał Java nullnie jest instancją żadnej klasy. Dlatego nie może być instancją żadnej klasy. instanceof zwróci jeden falselubtrue dlatego <referenceVariable> instanceof <SomeClass>zwraca, falsegdy referenceVariablewartość jest null.
instanceofOperator nie musi jawne nullkontrole, a nie rzucać NullPointerExceptionjeśli argument jestnull .
W czasie wykonywania wynik instanceofoperatora jest prawdziwy, jeśli wartość wyrażenia relacyjnego nie jest, nulla odwołanie można rzutować na typ odwołania bez zgłaszania wyjątku rzutowania na klasę.
Jeśli operand jest null, instanceofoperator zwraca, falsea zatem jawne sprawdzanie wartości NULL nie jest wymagane.
Rozważ poniższy przykład
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");
}
}
Prawidłowe użycie instanceofjest pokazane poniżej,
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");
}
}