programing

instance of를 호출하기 전에 null 체크가 필요합니까?

projobs 2022. 8. 13. 11:47
반응형

instance of를 호출하기 전에 null 체크가 필요합니까?

할 것이다null instanceof SomeClass돌아가다false또는 던지다NullPointerException?

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

표현x instanceof SomeClassfalse한다면xnull.

Java 11 Language Specification은 이것을 섹션 15.20.2의 "타입 비교 연산자 인스턴스"에서 간결하게 표현하고 있습니다(Java 17은 패턴 매칭 인스턴스의 도입 후 이를 보다 간결하게 표현합니다).

「실행시에, 그 결과는,instanceof오퍼레이터는true RelationalExpression 값이 아닌 경우 참조를 ReferenceType으로 캐스팅할 수 있습니다.ClassCastException그렇지 않으면 결과는 다음과 같습니다.false."

따라서 오퍼랜드가 null일 경우 결과는 false입니다.

null 참조를 첫 번째 오퍼랜드로 사용하여instanceof돌아온다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오퍼레이터는trueRelationalExpression 값이 다음 값이 아닌 경우null참조는, 「ReferenceType(참조 타입)」에 캐스트 할 수 있습니다.ClassCastException그렇지 않으면 결과는 다음과 같습니다.false.

API / 클래스 #is인스턴스(개체)

이 경우Classobject는 인터페이스를 나타냅니다.이 메서드는true지정된 클래스 또는 슈퍼클래스가Object인수는 이 인터페이스를 구현합니다.false그렇지않으면.이 경우Classobject는 기본 유형을 나타냅니다. 이 메서드는 반환됩니다.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.)


추신: 만약 채용을 하고 있다면, 이것을 면접 질문으로 사용하지 말아 주세요.:D

instanceof연산자는 명시적일 필요가 없습니다.null체크는, 송신되지 않기 때문에,NullPointerException오퍼랜드가null.

실행 시 의 결과instanceof연산자는 관계식의 값이 true가 아닌 경우 true입니다.null클래스 캐스팅 예외를 발생시키지 않고 참조 유형을 캐스팅할 수 있습니다.

오퍼랜드가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");
         }  
}
  • 인스턴스 전에 null 검사가 필요하지 않습니다.
  • 인스턴스가 true로 검증된 후에는 null 체크가 필요하지 않습니다.

다음은 null-safe입니다.

if(couldbenull instanceof Comparable comp){
   return comp.compareTo(somethingElse);
}
//java < 14
if(couldbenull instanceof Comparable){
   return ((Comparable)couldbenull).compareTo(somethingElse);
}

ㅇㅇㅇㅇ, ᄋ.null은 필요 .instanceof. 이 false이면 null.

Java Language Specification(Java 언어 사양)에 따라 비교합니다.instanceof.

실행 시 RelationalExpression 값이 null이 아니며 ClassCastException을 발생시키지 않고 참조를 ReferenceType으로 캐스팅할 수 있는 경우 instanceof 연산자의 결과가 true입니다.그렇지 않으면 결과는 거짓입니다.

에는 '자바'라는 을 알 수 .null 이 늘은, 이 늘 타입은, 「」로 됩니다.instanceoffalse(거짓)

Java 프로그래밍 언어에는 원시 유형과 참조 유형의 두 가지 유형이 있습니다.유형 및 값에 대한 Java 사양에 따름

또한 특별한 null 타입이 있습니다.식 null 타입에는 이름이 없습니다.null 타입에는 이름이 없기 때문에 null 타입의 변수를 선언하거나 null 타입으로 캐스트 할 수 없습니다.null 참조는 null 유형의 식에서 사용할 수 있는 유일한 값입니다.null 참조는 항상 모든 참조 유형으로 확대된 참조 변환을 수행할 수 있습니다.

, 에서는 확장 14, LTS Java 이 있습니다.instanceof·타입 비교 후 캐스트를 하는 패턴 매칭 기능이 있습니다.

public static void main(String[] args) {
    Object testObject = "I am a string";
    List<Object> testList = null;
    if (testList instanceof List) {
        System.out.println("instance of list");
    } else {
        System.out.println("null type");
    }
    //Enhanced instanceof with type conversion - tested with JDK 17
    if (testObject instanceof String str) {
        System.out.println(str.toUpperCase());
    }
}

산출량

null type
I AM A STRING

언급URL : https://stackoverflow.com/questions/2950319/is-null-check-needed-before-calling-instanceof

반응형