Double.parseDouble (null) 및 Integer.parseInt (null)에서 다른 예외가 발생하는 이유는 무엇입니까?


92

Double.parseDouble (null) 및 Integer.parseInt (null)에서 다른 예외가 발생하는 이유는 무엇입니까?

이것은 역사적 사고입니까, 의도적입니까? 문서에는에 대한 두 가지 유형의 예외 Double.parseDouble(...)와 하나에 대한 예외가 명시되어 Integer.parseInt()있지만 일관성이없는 것 같습니다.

Integer.parseInt(null); // throws java.lang.NumberFormatException: null

하나

Double.parseDouble(null); // throws java.lang.NullPointerException


2
각 메소드의 소스 코드를 확인하면 불일치로 보입니다. parseDoublenull 검사를 수행하지 않고 NPE가 발견되면 그냥 던지지 만에서는 parseInt입력 문자열이 null. 나는 그들이 다르게 행동해야하는 이유를 알 수 없다.
NilsH

나는 그들이 sameNumberFormatException을 던지는 지 확인했다.
twlkyao

답변:


67

null에 대해 동일한 예외가 throw 될 것으로 예상하는 것이 합리적입니다. 그러나 이러한 API는 매우 오래되어이 시점에서 변경할 수 없습니다.

과:

예외 동작은 오래 지속되고 JavaDoc에 지정되어 있기 때문에 현재 두 메서드의 동작을 변경하는 것은 비현실적입니다. 해결되지 않는 것처럼 닫습니다.

출처 : 버그 보고서 : Integer.parseInt () 및 Double.parseDouble ()은 null에 대해 다른 예외를 throw합니다.

다른 사람들이 말한 것처럼 : 다른 저자가 만든 것 같습니다.


2
관련되고 흥미로운 버그 보고서 : bugs.sun.com/view_bug.do?bug_id=6463998 Java 6 에서처럼 Double / Float 클래스의 구문 분석 메서드가 NPE를 발생시킵니다.
nhahtdh

2
재미있게, 주석이 기능은 "아주 오래된"라고 말했다 시간에, 그리고 지금은 15 년 전에이었다.
Southpaw Hare

이러한 불일치는 Java 1.0에서 발생했을 가능성이 높습니다. 불행히도 그것을 확인하는 것은 어려울 것입니다. Java 1.0을 다운로드 할 수 없다고 생각하며 실행하려면 Windows 95 / NT 상자가 필요합니다. 또는 고대 SPARC 시스템.)
Stephen C

59

참고 :이 게시물의 모든 내용은 Java7-b147의 소스에 있습니다.

Double.parseDouble()Sun 라이브러리 (에서 sun.misc.FloatingDecimal)에 들어가는 첫 번째 중요한 일은 다음과 같습니다.

in = in.trim(); // don't fool around with white space.
                // throws NullPointerException if null

Integer.parseInt()Integer수업 에서 수동으로 수행됩니다 . 발생하는 첫 번째 중요한 일은 다음과 같습니다.

if (s == null) {
    throw new NumberFormatException("null");
}

두 명의 다른 저자가 있다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.