Czy należy sprawdzić null przed wywołaniem instanceof?
Czy null instanceof SomeClass
zwróci false
Czy rzuci NullPointerException
?
7 answers
Nie, sprawdzenie null nie jest konieczne przed użyciem instanceof.
Wyrażenie x instanceof SomeClass
jest false
Jeśli x
jest null
.
Ze specyfikacji języka Java, sekcja 15.2.2, "Typ comparison operator instanceof":
" w czasie wykonywania, wynik
instanceof
operatorem jesttrue
jeśli wartość relacji na nienull
a referencją może być cast to the ReferenceType bez podnoszeniaClassCastException
. W przeciwnym razie wynikiem jestfalse
."
Więc jeśli operand jest null, wynik jest false.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 21:12:03
Użycie referencji null jako pierwszego operandu instanceof
zwraca false
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 16:56:33
Bardzo dobre pytanie. Próbowałem tylko 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));
}
}
Druki
true
true
false
false
JLS / 15.20.2. Operator porównania typów instanceof
W czasie wykonywania, wynikiem operatora
instanceof
jesttrue
, Jeśli wartość RelationalExpression nie jestnull
, A odniesienie może być rzucone na ReferenceType bez podnoszeniaClassCastException
. W przeciwnym razie wynikiem jestfalse
.
API / Class#isInstance(Object)
Jeśli obiekt
Class
reprezentuje interfejs, metoda ta zwracatrue
jeśli klasa lub jakakolwiek Klasa nadrzędna podanego argumentuObject
implementuje ten interfejs; zwracafalse
w przeciwnym razie. Jeśli obiektClass
reprezentuje typ prymitywny, metoda ta zwracafalse
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-22 03:27:02
Nie, Nie jest. instanceof
zwróci false
, jeśli jego pierwszym operandem jest null
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-21 10:49:10
Nie . Literał Javy null
nie jest instancją żadnej klasy. Dlatego nie może być instanceof dowolne zajęcia. instanceof
zwróci false
lub true
dlatego <referenceVariable> instanceof <SomeClass>
zwraca false
, Gdy referenceVariable
wartość jest null.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-28 13:55:49
Tak jak tidbit :
Nawet (
((A)null)
instanceof A)
powróci false
.
(Jeśli typecasting null
wydaje się zaskakujący, czasami trzeba to zrobić, na przykład w takich sytuacjach:
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)
wydrukuje a instanceof A: false
.)
P. S.: jeśli zatrudniasz, nie używaj tego jako pytania na rozmowę kwalifikacyjną. : D
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-21 07:10:15
Operator instanceof
nie wymaga jawnych sprawdzeń null
, ponieważ nie rzuca NullPointerException
, Jeśli operand jest null
.
W czasie wykonywania, wynik operatora instanceof
jest prawdziwy, jeśli wartość wyrażenia relacyjnego nie jest null
i odniesienie może być rzucone na typ odniesienia bez podnoszenia wyjątku Cast klasy.
Jeśli operandem jest null
, operator instanceof
zwraca false
, a zatem jawne sprawdzanie null nie jest wymagane.
Rozważ poniższe 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");
}
}
Poprawne użycie instanceof
jest jak pokazano 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");
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-21 09:45:47