Wird null instanceof SomeClass
zurückkehren false
oder ein werfen NullPointerException
?
Wird null instanceof SomeClass
zurückkehren false
oder ein werfen NullPointerException
?
Antworten:
Nein, eine Nullprüfung ist nicht erforderlich, bevor instanceof verwendet wird.
Der Ausdruck x instanceof SomeClass
ist false
wenn x
ist null
.
Aus der Java-Sprachspezifikation, Abschnitt 15.20.2, "Typvergleichsoperatorinstanz von" :
"Zur Laufzeit ist das Ergebnis des
instanceof
Operators,true
wenn der Wert von RelationalExpression nicht lautetnull
und die Referenz in den ReferenceType umgewandelt werden kann, ohne a auszulösenClassCastException
. Andernfalls ist das Ergebnisfalse
."
Wenn der Operand also null ist, ist das Ergebnis falsch.
try it
weil das aktuelle Verhalten nicht mit dem garantierten Verhalten identisch ist .
Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceof
Operator war Teil von Java 1.0, das vor fast 20 Jahren veröffentlicht wurde. Es ist unwahrscheinlich, das Verhalten jetzt so zu ändern, dass der vorhandene Code beschädigt wird, ohne dass ein Vorteil vorliegt, der die enormen Kosten überwiegt. Vor zwanzig Jahren gab es möglicherweise Argumente für die Rückgabe von true, wenn das Argument umgewandelt werden konnte, oder für die Auslösung einer Ausnahme für ein Nullargument. Diese Definitionen hätten jedoch separate Nullprüfungen erforderlich gemacht.
Sehr gute Frage. Ich habe es nur selbst versucht.
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));
}
}
Druckt
true
true
false
false
JLS / 15.20.2. Typvergleich Operator-Instanz von
Zur Laufzeit ist das Ergebnis des
instanceof
Operators,true
wenn der Wert von RelationalExpression nicht lautetnull
und die Referenz in den ReferenceType umgewandelt werden kann, ohne a auszulösenClassCastException
. Ansonsten ist das Ergebnisfalse
.
API / Klasse # isInstance (Objekt)
Wenn dieses
Class
Objekt eine Schnittstelle darstellt, gibt diese Methode zurück,true
wenn die Klasse oder eine Oberklasse des angegebenenObject
Arguments diese Schnittstelle implementiert. es kehrtfalse
anders zurück. Wenn diesesClass
Objekt einen primitiven Typ darstellt, gibt diese Methode zurückfalse
.
s
ist nur eine Objektreferenzvariable. Es kann auf ein tatsächlich vorhandenes Objekt ( ""
) oder auf eine (die) null
Literalreferenz verweisen.
null
sind keine Zeichenfolgendaten, egal welche Variable darauf zeigt. s instanceof String
ist nicht dasselbe wie field.getType().equals(String.class)
zum Beispiel.
s instanceof String
der s
mit dem aktuellen Wert ersetzt wird, so dass würde "" instanceof String
und null instanceof String
. So darüber nachzudenken kann sinnvoller sein.
Nein, ist es nicht. instanceof
würde zurückkehren, false
wenn sein erster Operand ist null
.
Nur als Leckerbissen :
Auch wird zurückkehren .(
((A)null)
instanceof A)
false
(Wenn Typografie null
überraschend erscheint, müssen Sie dies manchmal tun, beispielsweise in Situationen wie diesen:
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).
}
}
So Test.test((A)null)
wird gedruckt a instanceof A: false
.)
PS: Wenn Sie einstellen, verwenden Sie dies bitte nicht als Frage für ein Vorstellungsgespräch. : D.
Nein . Java-Literal null
ist keine Instanz einer Klasse. Daher kann es keine Instanz einer Klasse sein. instanceof
gibt entweder false
odertrue
daher die <referenceVariable> instanceof <SomeClass>
Rückgabe zurück, false
wenn der referenceVariable
Wert null ist.
Der instanceof
Operator benötigt keine expliziten null
Überprüfungen, da er kein a auslöst, NullPointerException
wenn der Operand ist null
.
Zur Laufzeit ist das Ergebnis des instanceof
Operators wahr, wenn der Wert des relationalen Ausdrucks nicht stimmt null
und die Referenz in den Referenztyp umgewandelt werden kann, ohne eine Klassenumwandlungsausnahme auszulösen.
Wenn dies der Operand ist null
, gibt der instanceof
Operator zurück false
und daher sind keine expliziten Nullprüfungen erforderlich.
Betrachten Sie das folgende Beispiel:
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");
}
}
Die korrekte Verwendung von instanceof
ist wie unten gezeigt,
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");
}
}