Wird null instanceof SomeClasszurückkehren falseoder ein werfen NullPointerException?
Wird null instanceof SomeClasszurückkehren falseoder ein werfen NullPointerException?
Antworten:
Nein, eine Nullprüfung ist nicht erforderlich, bevor instanceof verwendet wird.
Der Ausdruck x instanceof SomeClassist falsewenn xist null.
Aus der Java-Sprachspezifikation, Abschnitt 15.20.2, "Typvergleichsoperatorinstanz von" :
"Zur Laufzeit ist das Ergebnis des
instanceofOperators,truewenn der Wert von RelationalExpression nicht lautetnullund 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 itweil das aktuelle Verhalten nicht mit dem garantierten Verhalten identisch ist .
Effective Java- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceofOperator 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
instanceofOperators,truewenn der Wert von RelationalExpression nicht lautetnullund die Referenz in den ReferenceType umgewandelt werden kann, ohne a auszulösenClassCastException. Ansonsten ist das Ergebnisfalse.
API / Klasse # isInstance (Objekt)
Wenn dieses
ClassObjekt eine Schnittstelle darstellt, gibt diese Methode zurück,truewenn die Klasse oder eine Oberklasse des angegebenenObjectArguments diese Schnittstelle implementiert. es kehrtfalseanders zurück. Wenn diesesClassObjekt einen primitiven Typ darstellt, gibt diese Methode zurückfalse.
sist nur eine Objektreferenzvariable. Es kann auf ein tatsächlich vorhandenes Objekt ( "") oder auf eine (die) nullLiteralreferenz verweisen.
nullsind keine Zeichenfolgendaten, egal welche Variable darauf zeigt. s instanceof Stringist nicht dasselbe wie field.getType().equals(String.class)zum Beispiel.
s instanceof Stringder smit dem aktuellen Wert ersetzt wird, so dass würde "" instanceof Stringund null instanceof String. So darüber nachzudenken kann sinnvoller sein.
Nein, ist es nicht. instanceofwürde zurückkehren, falsewenn 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 nullist keine Instanz einer Klasse. Daher kann es keine Instanz einer Klasse sein. instanceof gibt entweder falseodertrue daher die <referenceVariable> instanceof <SomeClass>Rückgabe zurück, falsewenn der referenceVariableWert null ist.
Der instanceofOperator benötigt keine expliziten nullÜberprüfungen, da er kein a auslöst, NullPointerExceptionwenn der Operand ist null.
Zur Laufzeit ist das Ergebnis des instanceofOperators wahr, wenn der Wert des relationalen Ausdrucks nicht stimmt nullund die Referenz in den Referenztyp umgewandelt werden kann, ohne eine Klassenumwandlungsausnahme auszulösen.
Wenn dies der Operand ist null, gibt der instanceofOperator zurück falseund 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 instanceofist 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");
}
}