[java] instanceof를 호출하기 전에 null 검사가 필요합니까?

null instanceof SomeClass반환 false또는 던져 NullPointerException?



답변

아니요, instanceof를 사용하기 전에 null 검사가 필요하지 않습니다.

표현식 x instanceof SomeClassfalseif x입니다 null.

Java 언어 사양, 섹션 15.20.2, “유형 비교 연산자 instanceof”에서 :

“런타임에서 instanceof연산자 의 결과
trueRelationalExpression 의 값 이 아닌null 경우 참조는
을 올리지 않고 ReferenceType 으로 캐스트 할 수 있습니다 ClassCastException. 그렇지 않으면 결과는 false” 입니다 . “

따라서 피연산자가 널이면 결과는 false입니다.


답변

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

JLS / 15.20.2. 유형 비교 연산자 instanceof

런타임시 instanceof연산자 의 결과 trueRelationalExpression 의 값 이 아니고 참조를 을 올리지 않고 ReferenceTypenull 으로 캐스트 할 수있는 경우 입니다. 그렇지 않으면 결과는 입니다.ClassCastExceptionfalse

API / 클래스 #isInstance (오브젝트)

Class객체가 인터페이스를 나타내는 경우,이 메소드는 true, 지정된 Object인수 의 클래스 또는 슈퍼 클래스 가이 인터페이스를 구현 하고있는 경우를 돌려줍니다 . false그렇지 않으면 반환 합니다. 이 Class객체가 원시적 형을 나타내는 경우 ,이 메소드는를 리턴합니다 false.


답변

아뇨. 첫 번째 피연산자가 인 경우 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.)


추신 : 고용하는 경우, 이것을 면접 질문으로 사용하지 마십시오. :디


답변

없음 . Java 리터럴 null은 어떤 클래스의 인스턴스도 아닙니다. 따라서 클래스 의 인스턴스가 될 수 없습니다 . instanceof 중 반환 false또는true 때문에 <referenceVariable> instanceof <SomeClass>반환 false할 때 referenceVariable값이 null입니다.


답변

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