2011-07-06 4 views
30
class ThrowNull { 
    public static void main(String[] args) { 
     throw null; 
    } 
} 

throw에 대한 규칙은 throw ThrowableInstance;입니다. 여기에서 ThrowableInstance은 Throwable 유형의 객체이거나 Throwable의 서브 클래스 여야합니다.Java에서 컴파일 오류가 발생하지 않는 이유는 무엇입니까?

String 또는 Object와 같은 Throwable 클래스가 아닌 int 또는 char과 같은 단순 유형은 예외로 사용할 수 없습니다. null은 Null 값을 나타내는 특수 Java 리터럴입니다.

그럼 왜이 코드에서 throw null;이 컴파일 될까요?

+3

왜 컴파일 타임 오류가 발생해야합니까? – BoltClock

+0

현재 Java 컴파일러 자체에 의해 문제의 플래그가 지정되지는 않지만 (나중에 언어 사양이 변경되지 않는 한) "소나 (sonar)"와 같은 정적 체커 (static checker)가 분명히 후보로 나와 있습니다. 개발자. 어쩌면 개발자가 "return null"을 쓰고 싶어했을 것입니다 ... –

+2

'String a() {return null}'을 호출 한 결과는 (sub) 클래스 또는 String의 객체 여야한다는 규칙을 알고 있습니다. Throwable 또는 BigInteger와 같은 간단한 클래스는 문자열로 사용할 수 없습니다. Null은 null 값을 나타내는 특수 Java 리터럴입니다.그렇다면 왜'return null'이 컴파일 시간 오류를 발생시키지 않는지? ????? !!!! 나는 당신의 이중 기준을 여기에 드러내고있다. 왜 당신은''null을 던지지만''return null'에 대해 불평합니까? 나는 그러므로 당신의 질문을 upvote 수 없습니다. 그것은 이중 표준에 의해 너무 지역화되어 있습니다. – Val

답변

54

language specification에 따르면, throw 문은 다음과 같이 정의된다

throw Expression 

그리고 Expressionnull로 평가되면, 다음 NullPointerException가 발생합니다. 구체적

식의 평가는 null 값을 생성 정상적으로 완료되면, 인스턴스 V '의 클래스 NullPointerException 만들고 대신 null으로 발생된다.

NullPointerExceptionRuntimeException까지이므로 확인되지 않은 예외입니다. 이것은 왜이 구조에서 컴파일 타임 오류가보고되지 않는지 설명 할 수 있습니다.

5

컴파일러가 확인하지 않는 많은 것들이 있습니다. 알 수없는 좋은 이유 때문에 일을한다고 가정합니다. 예방하려고 시도하는 것은 개발자가 자주 범하는 실수입니다.

어떤 사람이이

throw new NullPointerException(); 

Integer i = null; 
try { 
    i.intValue(); 
} catch (NullPointerException npe) { 
    System.err.println("Caught NPE"); 
    npe.printStackTrace(); 
} 

자바 6 업데이트에서

try { 
    throw null; 
} catch (NullPointerException npe) { 
    System.err.println("Caught NPE"); 
    npe.printStackTrace(); 
} 

인쇄를위한 좋은 짧은 손으로 생각 할 수있다 (38)

Caught NPE 
java.lang.NullPointerException 
    at Main.main(Main.java:9) 
+0

@DanielWerner 모든 예외 및 오류 및 OutOfmemoryError 및 ThreadDeath조차도 catch 할 수 있습니다. ;) 나의 예를 보라. –

2

generel에서 던지기 만하면 안됩니다. 모든 오브젝트 변수에 널 (null)을 지정할 수 있습니다. 그래서 우리는 던지기가 특별한 경우가 아니라는 것을 알 수 있습니다. 그럴까요? 아마도. 일관성이 있습니까? 예.

3

Null은 던져 넣기 대신 null을 던지면 컴파일 타임에 아무런 타입도 참조 할 수 없기 때문에 생각합니다.

+0

정확합니다. String를 돌려주는 메소드는 null을 돌려주는 경우가 있습니다. 왜 문자열 변수는 null이 될 수 있지만 Throwable 변수는 가질 수 없습니까? OP는 분명히 근시안 (x)이거나 이중 표준을 행사합니다. – Val

+0

이것은 좋게 들릴지 모르지만 사실이 아닙니다. 수락 된 답변을 참조하십시오. – Vlasec

관련 문제