null instanceof SomeClass
はfalse
を返しますか、それともNullPointerException
をスローしますか?
いいえ、instanceofを使用する前にnullチェックは必要ありません。
false
がx
の場合、式x instanceof SomeClass
はnull
になります。
Java言語仕様、 セクション15.20.2、「型比較演算子instanceof」 :
"実行時に、RelationalExpression の値が
instanceof
でない場合、true
演算子の結果はnull
になります。ClassCastException
を上げることなくReferenceTypeにキャストできます。それ以外の場合、結果はfalse
になります。
したがって、オペランドがNULLの場合、結果は偽です。
instanceof
の最初のオペランドとしてnull参照を使用すると、false
が返されます。
とても良い質問です。私は自分で試しただけです。
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));
}
}
版画
true
true
false
false
実行時に、RelationalExpressionの値が
instanceof
ではなく、true
を上げることなく参照をReferenceTypeにキャストできる場合、null
演算子の結果はClassCastException
になります。それ以外の場合、結果はfalse
です。
この
Class
オブジェクトがインタフェースを表す場合、指定されたtrue
引数のクラスまたは任意のスーパークラスがこのインタフェースを実装している場合、このメソッドはObject
を返します。それ以外の場合はfalse
を返します。このClass
オブジェクトがプリミティブ型を表す場合、このメソッドはfalse
を返します。
いいえ、ちがいます。最初のオペランドがinstanceof
の場合、false
はnull
を返します。
いいえ。 Javaリテラルnull
は、どのクラスのインスタンスでもありません。したがって、それを instanceof anyクラスにすることはできません。 instanceof
false
またはtrue
のいずれかを返しますしたがって、false
の値がnullの場合、<referenceVariable> instanceof <SomeClass>
はreferenceVariable
を返します。
のように :
(
((A)null)
instanceof A)
でもfalse
を返します。
(null
を型キャストするのが驚くように思えば、時々あなたはそれをしなければなりません、例えばこのような状況で:
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).
}
}
そのためTest.test((A)null)
はa instanceof A: false
を表示します。)
P:あなたが雇用しているなら、就職の面接の質問としてこれを使わないでください。 :D
instanceof
演算子は、オペランドがnull
の場合にNullPointerException
をスローしないため、明示的なnull
チェックを必要としません。
実行時に、関係式の値がinstanceof
でなく、クラスキャスト例外を発生させずに参照を参照型にキャストできる場合、null
演算子の結果はtrueです。
オペランドがnull
の場合、instanceof
演算子はfalse
を返すため、明示的なnullチェックは必要ありません。
以下の例を考えてください。
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");
}
}
instanceof
の正しい使い方は以下の通りです。
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");
}
}