클래스 캐스트 대신 널 포인터가 필요한 이유는 무엇입니까?


26

자바에서 :

int count = (Integer) null;

java.lang.NullPointerException을 던집니다.

프로그래머가 이해하기 쉽도록 클래스 캐스트 예외가 발생하지 않는 이유는 무엇입니까?

이 예외가 다른 예외보다 선택된 이유는 무엇입니까?

답변:


46

코드를 실행할 때 Java 런타임은 다음을 수행합니다.

  1. Integer 클래스의 오브젝트에 널을 캐스트하십시오.
  2. intValue () 메소드를 호출하여 Integer 객체를 int로 개봉하십시오.
  3. 널 오브젝트에서 메소드를 호출하면 NullPointerException이 발생합니다.

즉, 문제없이 null을 정수로 캐스트 할 수 있지만 null 정수 개체는 int 유형의 값으로 변환 할 수 없습니다.

편집하다

얼마 전 Stack Overflow에서 관련 질문이있었습니다 . 여기를 참조 하십시오 .


1

Java는 오브젝트를 참조하지 않는 정수 참조로 널을 성공적으로 캐스트합니다.

확인되지 않은 상태는 참조에 유효한 상태이기 때문에 괜찮습니다.

수행 할 수없는 기존 객체가 아닌 메소드를 호출하는 것입니다.

캐스트를 수행하는 (Integer)null것은 Integer 변수를 선언 한 다음 새로운 (또는 기존의) Integer 객체 인스턴스를 할당하지 않는 것과 같습니다.


-1

를 언 박싱하려면 Integerint예에서 int i = new Integer(15);, i실제로 같다 new Integer(15).intValue() i = (Integer) o; 어디 Object o = 15o = Integer.valueOf(15);같지만 i = null; 는를 던지기 NullPointerException때문에 inull.intValue()던집니다 NullPointerException.


2
거의 2 년 전에 받아 들여진 대답은 거의 같은 설명을 제공하지만 더 명확합니다. 이 답변은 Java 5+에도 맞지 않습니다. 이제 valueOf()복싱을위한 새 인스턴스를 만드는 대신 팩토리 메소드를 사용합니다 .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.