Java에서 null을 사용할 수 있는 이유는 무엇입니까?
실행 시:
public class WhatTheShoot {
public static void main(String args[]){
try {
throw null;
} catch (Exception e){
System.out.println(e instanceof NullPointerException);
System.out.println(e instanceof FileNotFoundException);
}
}
}
응답은 다음과 같습니다.
true
false
그것은 나에게 꽤 놀라운 것이었다.이렇게 하면 컴파일 시 오류가 발생할 것으로 생각됩니다.
Java에서 null을 슬로우할 수 있는 이유 및 Null Pointer에 업캐스트하는 이유예외?
(실제로 '업캐스트'인지 아닌지는 알 수 없습니다)
같은 질문은 하지 을 저는 그 를 알 수 .throw null
아마 당신은 해고되고 싶겠지만, 하지만 그건...내 말은, 왜 다른 사람이throw null
재미있는 사실인텔리J IDEA 12는 제 대사가e instanceof NullPointerException
거짓이다그건 전혀 사실이 아니야
것 null
is as as 로 취급을 NullPointerException
, 「」를 「」를 합니다.throw null
그 자체에서NullPointerException
말하면, 「 」입니다.throw
는 그 null인 "null"을 "null"로 합니다.NullPointerException
.
JLS 14.18 은, 다음의 동작을 지정합니다.
식 평가가 정상적으로 완료되어 null 값이 생성되면 Null Pointer 클래스의 인스턴스 V'가 생성됩니다.예외가 생성되어 null 대신 느려집니다.throw 문이 갑자기 완료되는데, 그 이유는 값이 V'인 throw이기 때문입니다.
Null Pointer에 업캐스트하는 이유는 무엇입니까?예외?
JLS 14.18에 따라:
먼저 throw 문이 식을 평가합니다.어떤 이유로 표현식의 평가가 갑자기 완료되면 그 이유로 투척이 갑자기 완료됩니다.식 평가가 정상적으로 완료되어 null이 아닌 값 V가 생성되면 throw 문이 갑자기 완료됩니다. 그 이유는 값이 V인 throw이기 때문입니다.식 평가가 정상적으로 완료되어 null 값이 생성되면 Null Pointer 클래스의 인스턴스 V'가 생성됩니다.예외가 생성되어 null 대신 느려집니다.throw 문이 갑자기 완료되는데, 그 이유는 값이 V'인 throw이기 때문입니다.
Java에서 null을 던질 수 있는 이유는 무엇입니까?
수 .Throwable
그 이후로null
는 에 대한 한 참고 자료입니다.Throwable
할 수 있습니다
Neal Gafter는 이렇게 말합니다(아카이브).
null은 모든 참조 유형에 할당할 수 있지만 null 유형 자체가 참조 유형은 아닙니다.슬로우 스테이트먼트의 표현이 레퍼런스 타입이라는 요건이 JLS 제3판에서 삭제되는 것이 우리의 의도였지만, 그 변경은 실제로 공개 버전으로 만들어지지 않았다.따라서 SE 5에서 소개한 javac 컴파일러 버그입니다.
JLS에 준거하여 동작합니다.
식 평가가 정상적으로 완료되어 null 값이 생성되면 Null Pointer 클래스의 인스턴스 V'가 생성됩니다.예외가 생성되어 null 대신 느려집니다.
이렇게 생각하면 이것이 왜 기능하는지가 조금 더 명확해집니다.
try {
Exception foo = null;
if(false) {
foo = new FileNotFoundException();
} // Oops, forgot to set foo for the true case..
throw foo;
} catch (Exception e){
System.out.println(e instanceof NullPointerException);
System.out.println(e instanceof FileNotFoundException);
}
확실히는 모르지만, 「null」이라고 생각됩니다만, 동작하지 않습니다.그 때문에, 프로그램이 예외를 슬로우 해, 그 예외는 (드럼 롤) Null Pointer입니다.예외...
null은 예외를 포함하여 모든 *에 캐스트할 수 있습니다.메서드 시그니처에 예외(또는 문자열 또는 개인 클래스)가 지정되어 있는 경우 null을 반환할 수 있는 경우와 마찬가지로 null을 반환할 수 있습니다.
※ 프리미티브 타입은 제외합니다.
바랄...javac 컴파일러 버그로 보입니다.SE 5에서 도입된 것 같습니다. Null은 모든 참조 유형에 할당할 수 있습니다.그러나 "null 유형" 자체는 참조 유형이 아닙니다.null이 예외로 캐스팅될 수 있기 때문에 프로그램은 이를 컴파일합니다.또한 throw는 선언 후 객체 참조를 찾고 null은 객체 참조로 작동할 수 있으므로 결과를 표시합니다.
투척에 관한 JLS 문서:
"throw 문은 먼저 식을 평가합니다.어떤 이유로 표현식의 평가가 갑자기 완료되면 그 이유로 투척이 갑자기 완료됩니다.식 평가가 정상적으로 완료되어 null이 아닌 값 V가 생성되면 throw 문이 갑자기 완료됩니다. 그 이유는 값이 V인 throw이기 때문입니다.식 평가가 정상적으로 완료되어 null 값이 생성되면 Null Pointer 클래스의 인스턴스 V'가 생성됩니다.예외가 생성되어 null 대신 느려집니다.그러면 던지기 문이 갑자기 완성되는데, 그 이유는 V' 값을 가진 던지기 때문이라고 말했다.
언급URL : https://stackoverflow.com/questions/17576922/why-can-i-throw-null-in-java
'source' 카테고리의 다른 글
REST 웹 서비스에서 클라이언트로 파일을 보내는 올바른 방법은 무엇입니까? (0) | 2022.12.08 |
---|---|
다운로드 RDS 스냅샷 (0) | 2022.11.28 |
루프를 위해 vuejs의 첫 번째 요소에 class="active"를 설정하는 방법 (0) | 2022.11.28 |
Gradle을 사용할 때 과도적 종속성의 모든 인스턴스를 제외하려면 어떻게 해야 합니까? (0) | 2022.11.28 |
JAVA_HOME은 JRE가 아닌 JDK를 가리켜야 합니다. (0) | 2022.11.28 |