web-dev-qa-db-ja.com

Instanceofを呼び出す前にnullチェックが必要ですか?

null instanceof SomeClassfalseを返しますか、それともNullPointerExceptionをスローしますか?

1203
Johan Lübcke

いいえ、instanceofを使用する前にnullチェックは必要ありません。

falsexの場合、式x instanceof SomeClassnullになります。

Java言語仕様、 セクション15.20.2、「型比較演算子instanceof」

"実行時に、RelationalExpression の値がinstanceofでない場合、true演算子の結果はnullになります。 ClassCastExceptionを上げることなくReferenceTypeにキャストできます。それ以外の場合、結果はfalseになります。

したがって、オペランドがNULLの場合、結果は偽です。

1629
Andy Thomas

instanceofの最初のオペランドとしてnull参照を使用すると、falseが返されます。

254
Bozho

とても良い質問です。私は自分で試しただけです。

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

JLS/15.20.2。型比較演算子instanceof

実行時に、RelationalExpressionの値がinstanceofではなく、trueを上げることなく参照をReferenceTypeにキャストできる場合、null演算子の結果はClassCastExceptionになります。それ以外の場合、結果はfalseです。

API/Class#isInstance(Object)

このClassオブジェクトがインタフェースを表す場合、指定されたtrue引数のクラスまたは任意のスーパークラスがこのインタフェースを実装している場合、このメソッドはObjectを返します。それ以外の場合はfalseを返します。このClassオブジェクトがプリミティブ型を表す場合、このメソッドはfalseを返します。

66
Jin Kwon

いいえ、ちがいます。最初のオペランドがinstanceofの場合、falsenullを返します。

24

いいえ。 Javaリテラルnullは、どのクラスのインスタンスでもありません。したがって、それを instanceof anyクラスにすることはできません。 instanceoffalseまたはtrueのいずれかを返しますしたがって、falseの値がnullの場合、<referenceVariable> instanceof <SomeClass>referenceVariableを返します。

6
display_name

のように

(((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

6
Attila Tanyi

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");
         }  
}
2
Nikhil Kumar