Чому 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
@Aquillo: Існує doubleпримітивний docs.oracle.com/javase/tutorial/java/nutsandbolts/…
nhahtdh

2
Перевірка вихідного коду відповідних методів здається просто невідповідністю. parseDoubleне робить нульової перевірки, а просто кидає NPE, коли він зустрічається, але в parseInt, тоді вхідний рядок перевіряється null. Я не бачу жодної вагомої причини, чому вони повинні поводитися по-іншому.
NilsH

Я перевірив, що вони кидають те самеNumberFormatException.
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 років тому.
Заєць Саутпау

Ця невідповідність, швидше за все, походить від Java 1.0. На жаль, було б важко це перевірити. Я не думаю, що Java 1.0 доступна для завантаження, і для її запуску вам знадобиться вікно Windows 95 / NT. Або стародавня машина SPARC.)
Стівен С

59

Примітка: у цьому дописі все є джерелом Java7-b147

Double.parseDouble()заходить у бібліотеку Sun (in 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");
}

Я гадаю, є два різні автори.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.