2010-07-25 5 views

답변

18

, 당신은이 반환 false로 평가합니다

if(a instanceof A) {} 

로 할 수있는 null

+5

+1 JLS 도시 된 바와 같이 아래의 예를 고려 런시를 instanceof 연산자의 결과가있는 경우 true RelationExpression의 값이 null가 아니고, ClassCastException를 발생시키지 않고, ReferenceType에 레퍼런스를 캐스트 할 수있다 (§15.16). 그렇지 않은 경우 결과는 false입니다. http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#80289 – barrowc

+0

@barrowc 핀이 점을 가리 킵니다. – naikus

+0

저는 97 년 이래로 자바 프로그래밍을 해왔습니다. 고마워, +1! –

0

내가 심각하게 의심 첫 번째 널 (null) 검사에 대한 혜택이 있음 . VM이 instancof 검사를 구현하는 방법은 ... 확률은 if 자체를 코드의 첫 번째 부분으로 수행하는 것입니다.

+1

VM이 아닌 것. 그것의 사양은 "널 타입"은 하나의 값, 즉 null 참조를 갖는다. null 참조는 "null type"타입이므로 위의 검사는 다른 유형 인 – naikus

+0

에 대해 false를 반환합니다. VM이 코드를 구현해야합니다. 그러면 가장 먼저 null을 확인합니다. 따라서 성능 향상이 없습니다. 수표를 넣으면 RESULT가 지정됩니다. 결과가 어떻게 달성되는지는 아닙니다. – TofuBeer

+0

@TofuBeer 동작이 * 지정됩니다. * null을 확인해야합니다. 그것은 어떤 식 으로든 구현에 달려 있지 않습니다. – EJP

2

if(a instanceof A)이면 충분합니다.

a이 null 인 경우 NullPointerException을 던질 때 사용됩니다. a instanceof A은 NPE를 던지지 않고 a이 null 인 경우 false을 반환합니다.

4

JVM 자체가 null인지 확인해야합니다. 두 번하는 것이별로 중요하지 않습니다.

0

instanceOf 연산자는 피연산자가 null 인 경우 널 포인터 예외를 throw하지 않기 때문에 명시 적 null 검사가 필요하지 않습니다.

런타임시 관계형 표현식의 값이 null이 아니고 클래스 캐스트 예외를 발생시키지 않고 참조가 참조 유형으로 형변환 될 수있는 경우 instanceOf 연산자의 결과는 true입니다.

피연산자가 null 인 경우 instanceOf 연산자는 false를 반환하므로 명시 적 null 검사가 필요하지 않습니다.

public static void main(String[] args) { 
             if(a != null && a instanceof ArrayList){                     //Violation 
                  System.out.println("In if block"); 
             } 
             else 
             { 
                  System.out.println("In else block"); 
             } 
         } 

instanceof는의 올바른 사용법이 아래

public static void main(String[] args) { 
           
             if(a instanceof ArrayList){                     //Correct way 
                  System.out.println("In if block"); 
             } 
             else 
             { 
                  System.out.println("In else block"); 
             } 
         } 
관련 문제