Почему 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
pho79
источник
2
@Aquillo: Есть doubleпримитивные docs.oracle.com/javase/tutorial/java/nutsandbolts/…
nhahtdh
2
Проверяя исходный код соответствующих методов, кажется, что это просто несоответствие. parseDoubleне выполняет нулевую проверку, а просто выдает NPE при обнаружении, но в parseInt, затем проверяется входная строка null. Я не вижу веской причины, по которой они должны вести себя иначе.
NilsH
Я проверил, что они генерируют исключение sameNumberFormatException.
twlkyao

Ответы:

67

Разумно ожидать, что те же исключения будут выброшены для null; однако эти api очень старые и не могут быть изменены на данном этапе.

А также:

Поскольку поведение исключения существует давно и определено в JavaDoc, в настоящее время нецелесообразно изменять поведение любого метода. Закрытие как не исправит.

Как взято из: Отчет об ошибке: Integer.parseInt () и Double.parseDouble () генерируют разные исключения для null.

Как утверждали другие: вероятно, это сделано разными авторами.

Флорис Веллеман
источник
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.)
Стивен К.
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");
}

Думаю, есть два разных автора.

durron597
источник