source

Java에서 null을 사용할 수 있는 이유는 무엇입니까?

lovecheck 2022. 11. 28. 21:17
반응형

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

반응형