Sarà null instanceof SomeClasstornare falseo di gettare una NullPointerException?
Sarà null instanceof SomeClasstornare falseo di gettare una NullPointerException?
Risposte:
No, non è necessario un controllo null prima di utilizzare instanceof.
L'espressione x instanceof SomeClassè falseif xis null.
Da Java Language Specification, sezione 15.20.2, "Tipo di confronto dell'istanza dell'operatore" :
"In fase di esecuzione, il risultato
instanceofdell'operatore ètruese il valore di RelationalExpression non lo ènulle il riferimento potrebbe essere trasmesso a ReferenceType senza aumentare aClassCastException. Altrimenti il risultato èfalse."
Quindi se l'operando è nullo, il risultato è falso.
try itperché il comportamento attuale non è lo stesso del comportamento garantito .
Effective Java- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceofoperatore 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
instanceofdell'operatore ètruese il valore di RelationalExpression non lo ènulle il riferimento potrebbe essere trasmesso a ReferenceType senza aumentare aClassCastException. Altrimenti il risultato èfalse.
API / Class # isInstance (Object)
Se questo
Classoggetto rappresenta un'interfaccia, questo metodo restituiscetruese la classe o qualsiasi superclasseObjectdell'argomento specificato implementa questa interfaccia; ritornafalsealtrimenti. Se questoClassoggetto 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 nullriferimento letterale () .
nullnon sono dati stringa, indipendentemente dalla variabile che lo indica. s instanceof Stringnon è lo stesso field.getType().equals(String.class), ad esempio.
s instanceof Stringalla sviene sostituito con il valore effettivo, in modo che sarebbe diventato "" instanceof Stringe null instanceof String. Pensarci in questo modo potrebbe avere più senso.
No non lo è. instanceofritornerebbe falsese il suo primo operando è null.
Proprio come un bocconcino :
Anche tornerà .(((A)null)instanceof A)false
(Se il typecasting nullsembra 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 nullnon è un'istanza di nessuna classe. Pertanto non può essere un'istanza di nessuna classe. instanceof restituirà uno falseotrue quindi i <referenceVariable> instanceof <SomeClass>ritorni falsequando il referenceVariablevalore è null.
L' instanceofoperatore non ha bisogno di nullcontrolli espliciti , in quanto non genera un NullPointerExceptionse l'operando lo ènull .
In fase di esecuzione, il risultato instanceofdell'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' instanceofoperatore 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");
}
}