ウィルnull instanceof SomeClass
返すfalse
か、投げますかNullPointerException
?
ウィルnull instanceof SomeClass
返すfalse
か、投げますかNullPointerException
?
回答:
いいえ、instanceofを使用する前にnullチェックは必要ありません。
式x instanceof SomeClass
はfalse
if 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にキャストできる場合、演算子の結果は次のとおりです。それ以外の場合の結果はです。null
ClassCastException
false
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
返されます。false
null
ちょっと一言:
でも戻ります。(
((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");
}
}