Sarà null instanceof SomeClass
tornare false
o di gettare una NullPointerException
?
Sarà null instanceof SomeClass
tornare false
o di gettare una NullPointerException
?
Risposte:
No, non è necessario un controllo null prima di utilizzare instanceof.
L'espressione x instanceof SomeClass
è false
if x
is null
.
Da Java Language Specification, sezione 15.20.2, "Tipo di confronto dell'istanza dell'operatore" :
"In fase di esecuzione, il risultato
instanceof
dell'operatore ètrue
se il valore di RelationalExpression non lo ènull
e il riferimento potrebbe essere trasmesso a ReferenceType senza aumentare aClassCastException
. Altrimenti il risultato èfalse
."
Quindi se l'operando è nullo, il risultato è falso.
try it
perché il comportamento attuale non è lo stesso del comportamento garantito .
Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceof
operatore Java faceva parte di Java 1.0, rilasciato circa 20 anni fa. Cambiare il comportamento ora in un modo che spezzerebbe il codice esistente è improbabile, in assenza di alcuni benefici che superano quell'enorme costo. Venti anni fa, forse ci potevano essere argomenti per restituire vero se l'argomento potesse essere lanciato, o lanciare un'eccezione per un argomento nullo. Ma tali definizioni avrebbero richiesto controlli nulli separati.
Davvero un'ottima domanda. Ho appena provato per me stesso.
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));
}
}
stampe
true
true
false
false
JLS / 15.20.2. Tipo di confronto Operatore instanceof
In fase di esecuzione, il risultato
instanceof
dell'operatore ètrue
se il valore di RelationalExpression non lo ènull
e il riferimento potrebbe essere trasmesso a ReferenceType senza aumentare aClassCastException
. Altrimenti il risultato èfalse
.
API / Class # isInstance (Object)
Se questo
Class
oggetto rappresenta un'interfaccia, questo metodo restituiscetrue
se la classe o qualsiasi superclasseObject
dell'argomento specificato implementa questa interfaccia; ritornafalse
altrimenti. Se questoClass
oggetto rappresenta un tipo primitivo, questo metodo restituiscefalse
.
s
è solo una variabile di riferimento all'oggetto. Può fare riferimento a un oggetto ( ""
) effettivamente esistente o può fare riferimento a un null
riferimento letterale () .
null
non sono dati stringa, indipendentemente dalla variabile che lo indica. s instanceof String
non è lo stesso field.getType().equals(String.class)
, ad esempio.
s instanceof String
alla s
viene sostituito con il valore effettivo, in modo che sarebbe diventato "" instanceof String
e null instanceof String
. Pensarci in questo modo potrebbe avere più senso.
No non lo è. instanceof
ritornerebbe false
se il suo primo operando è null
.
Proprio come un bocconcino :
Anche tornerà .(
((A)null)
instanceof A)
false
(Se il typecasting null
sembra sorprendente, a volte devi farlo, ad esempio in situazioni come questa:
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).
}
}
Quindi Test.test((A)null)
stamperà a instanceof A: false
.)
PS: se stai assumendo, per favore non usarlo come domanda per un colloquio di lavoro. : D
No . Java Literal null
non è un'istanza di nessuna classe. Pertanto non può essere un'istanza di nessuna classe. instanceof
restituirà uno false
otrue
quindi i <referenceVariable> instanceof <SomeClass>
ritorni false
quando il referenceVariable
valore è null.
L' instanceof
operatore non ha bisogno di null
controlli espliciti , in quanto non genera un NullPointerException
se l'operando lo ènull
.
In fase di esecuzione, il risultato instanceof
dell'operatore è vero se il valore dell'espressione relazionale non lo ènull
e il riferimento può essere trasmesso al tipo di riferimento senza sollevare un'eccezione di cast di classe.
Se l'operando è null
, l' instanceof
operatore ritornafalse
e quindi non sono richiesti controlli null espliciti.
Considera l'esempio seguente,
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");
}
}
L'uso corretto di instanceof
è come mostrato di seguito,
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");
}
}