Będzie null instanceof SomeClass
powrotu false
lub rzucić NullPointerException
?
java
nullpointerexception
null
Johan Lübcke
źródło
źródło
Odpowiedzi:
Nie, sprawdzanie wartości zerowej nie jest konieczne przed użyciem instanceof.
Wyrażenie
x instanceof SomeClass
tofalse
jeślix
jestnull
.Ze specyfikacji języka Java, sekcja 15.20.2, „Instancja operatora porównania typów” :
Jeśli więc argument jest pusty, wynik jest fałszywy.
źródło
try it
dlatego, że obecne zachowanie nie jest tym samym, co zachowanie gwarantowane .Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683instanceof
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.Użycie odwołania zerowego jako pierwszego argumentu operacji do
instanceof
zwróceniafalse
.źródło
Rzeczywiście bardzo dobre pytanie. Właśnie próbowałem dla siebie.
Wydruki
JLS / 15.20.2. Porównanie typów Operator instanceof
API / Class # isInstance (Object)
źródło
s
jest tylko zmienną odwołania do obiektu. Może odwoływać się do faktycznie istniejącego obiektu (""
) lub może odnosić się donull
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, cofield.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 operacjinull
.źródło
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: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
źródło
Nie . Literał Java
null
nie jest instancją żadnej klasy. Dlatego nie może być instancją żadnej klasy.instanceof
zwróci jedenfalse
lubtrue
dlatego<referenceVariable> instanceof <SomeClass>
zwraca,false
gdyreferenceVariable
wartość jest null.źródło
instanceof
Operator nie musi jawnenull
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
Prawidłowe użycie
instanceof
jest pokazane poniżej,źródło