Będzie null instanceof SomeClass
powrotu false
lub rzucić NullPointerException
?
Będzie null instanceof SomeClass
powrotu false
lub rzucić NullPointerException
?
Odpowiedzi:
Nie, sprawdzanie wartości zerowej nie jest konieczne przed użyciem instanceof.
Wyrażenie x instanceof SomeClass
to false
jeśli x
jest null
.
Ze specyfikacji języka Java, sekcja 15.20.2, „Instancja operatora porównania typów” :
„W czasie wykonywania wynikiem działania
instanceof
operatora jest to,true
czy wartość RelationalExpression nie jest,null
a 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 it
dlatego, że obecne zachowanie nie jest tym samym, co zachowanie gwarantowane .
Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceof
operator 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
instanceof
operatora jesttrue
taki, że wartość RelationalExpression nie jest,null
a odwołanie może być rzutowane na ReferenceType bez podnoszenia aClassCastException
. W przeciwnym razie wynik jestfalse
.
API / Class # isInstance (Object)
Jeśli ten
Class
obiekt reprezentuje interfejs, ta metoda zwraca,true
jeśli klasa lub jakakolwiek nadklasa określonegoObject
argumentu implementuje ten interfejs; zwracafalse
inaczej. Jeśli tenClass
obiekt reprezentuje typ pierwotny, ta metoda zwracafalse
.
s
jest tylko zmienną odwołania do obiektu. Może odwoływać się do faktycznie istniejącego obiektu ( ""
) lub może odnosić się do null
dosłownego odwołania.
null
nie jest ciągiem danych, bez względu na to, która zmienna na to wskazuje. s instanceof String
to nie to samo, co field.getType().equals(String.class)
na przykład.
s instanceof String
s
"" instanceof String
null instanceof String
Nie, nie jest. instanceof
zwróci, false
jeśli jest to pierwszy argument operacji null
.
Tak jak smakołyk :
Nawet wróci .(
((A)null)
instanceof A)
false
(Jeśli rzutowanie null
wydaje 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 null
nie jest instancją żadnej klasy. Dlatego nie może być instancją żadnej klasy. instanceof
zwróci jeden false
lubtrue
dlatego <referenceVariable> instanceof <SomeClass>
zwraca, false
gdy referenceVariable
wartość jest null.
instanceof
Operator nie musi jawne null
kontrole, a nie rzucać NullPointerException
jeśli argument jestnull
.
W czasie wykonywania wynik instanceof
operatora jest prawdziwy, jeśli wartość wyrażenia relacyjnego nie jest, null
a odwołanie można rzutować na typ odwołania bez zgłaszania wyjątku rzutowania na klasę.
Jeśli operand jest null
, instanceof
operator zwraca, false
a 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 instanceof
jest 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");
}
}