2012-01-19 5 views
5
public class Null { 
    public static void greet() { 
     System.out.println("Hello world!"); 
    } 

    public static void main(String[] args) { 
     ((Null) null).greet(); 
    } 
} 

프로그램 출력 : Hello world!.
나는 그것이 NullPointerException을 던질 것이라고 생각했다.왜 NullPointerException이 발생하지 않습니까?

왜 그런 일이 일어나나요?

+1

이러한 눈을 아프게 코드를받을 수 있습니까? – JonH

+2

'.greet()'는'static' 메소드이므로 실제 클래스의 인스턴스에 액세스하지 않습니다. 그것은 단순히 객체의 타입 ("Null")을 알아야합니다. – cheeken

답변

6

그 이유는 greet()static 방법이기 때문입니다. 변수를 통한 정적 메소드 참조는 포인터를 참조 해제하지 않습니다. 컴파일러가이 사실에 대해 경고 했어야합니다. 왜 이렇게 왜 오 - 당신이 static 수정을 제거하면

다음은 npe

11

메서드 greet()은 정적이므로 Null 인 클로징 인스턴스는 필요하지 않습니다. 실제로, 당신은 그것을 다음과 같이 호출 할 수 있습니다 :

관련 문제