ウィルnull instanceof SomeClass返すfalseか、投げますかNullPointerException?
ウィルnull instanceof SomeClass返すfalseか、投げますかNullPointerException?
回答:
いいえ、instanceofを使用する前にnullチェックは必要ありません。
式x instanceof SomeClassはfalseif xですnull。
Java言語仕様のセクション15.20.2「タイプ比較演算子instanceof」から:
「実行時に、その結果
instanceofオペレータはあるtrueの値ならば関係式が ないnullと参照がにキャストすることができReferenceTypeが 上げずにClassCastException。そうしないと結果がありますfalse。」
したがって、オペランドがnullの場合、結果はfalseになります。
try itため、この答えはより正確です。
                    Effective Java- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
                    instanceofオペレーターは、ほぼ20年前にリリースされたJava 1.0の一部でした。既存のコードを壊すような方法で動作を変更することはほとんどありませんが、その莫大なコストを上回る利点がない場合はありません。20年前、引数をキャストできる場合はtrueを返したり、null引数の場合は例外をスローしたりするための引数があった可能性があります。ただし、これらの定義では、個別のnullチェックが必要になります。
                    確かに非常に良い質問です。自分で試したところです。
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にキャストできる場合、演算子の結果は次のとおりです。それ以外の場合の結果はです。nullClassCastExceptionfalse
API / Class#isInstance(オブジェクト)
この
Classオブジェクトがインターフェースを表す場合、このメソッドはtrue、指定されたObject引数のクラスまたはスーパークラスがこのインターフェースを実装するかどうかを返します。それfalse以外の場合は戻ります。このClassオブジェクトがプリミティブ型を表す場合、このメソッドはを返しますfalse。
sは単なるオブジェクト参照変数です。実際に存在するオブジェクト("")を参照する場合と、nullリテラル参照を参照する場合があります。
                    nullどの変数が指しているかに関係なく、文字列データではありません。  たとえばs instanceof String、と同じではありませんfield.getType().equals(String.class)。
                    s instanceof Stringでsが実際の値に置き換えられることを想像する必要が"" instanceof Stringありnull instanceof Stringます。このように考えるのはもっと理にかなっているかもしれません。
                    いいえ、ちがいます。最初のオペランドがの場合にinstanceof返されます。falsenull
ちょっと一言:
でも戻ります。(((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。)
PS:採用している場合、これを就職の面接の質問として使用しないでください。:D
いいえ。Javaリテラルnullは、クラスのインスタンスではありません。したがって、クラスのインスタンスにすることはできません。instanceof どちらかが返されますfalseまたはtrueそのため<referenceVariable> instanceof <SomeClass>のリターンをfalseするときreferenceVariable値がnullです。
instanceofオペレータは、明示的な必要はありませんnull、それはスローされませんので、チェックをNullPointerExceptionオペランドがある場合null。
実行時instanceofに、関係式の値がtrueでない場合、演算子の結果はtrueでありnull、クラスキャスト例外を発生させることなく、参照を参照型にキャストできます。
オペランドである場合null、instanceofオペレータに戻りfalse、したがっては、明示的なヌルチェックは必要とされません。
以下の例を考えてみましょう。
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");
         }  
}