Pourquoi Double.parseDouble (null) et Integer.parseInt (null) lèvent-ils des exceptions différentes?

92

Pourquoi Double.parseDouble (null) et Integer.parseInt (null) lèvent-ils des exceptions différentes?

Est-ce un accident historique ou intentionnel? La documentation indique clairement deux types d'exceptions pour Double.parseDouble(...)et un pour Integer.parseInt(), mais cela semble incohérent:

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

toutefois

Double.parseDouble(null); // throws java.lang.NullPointerException
pho79
la source
2
@Aquillo: Il y a doubleprimitif docs.oracle.com/javase/tutorial/java/nutsandbolts/…
nhahtdh
2
En vérifiant le code source des méthodes respectives, cela semble être juste une incohérence. parseDoublene fait pas de vérification nulle, et lance simplement un NPE lorsqu'il est rencontré, mais dans parseInt, alors la chaîne d'entrée est vérifiée null. Je ne vois aucune bonne raison pour laquelle ils devraient se comporter différemment.
NilsH
J'ai vérifié qu'ils lancent la même exceptionNumberFormatException.
twlkyao

Réponses:

67

Il est raisonnable de s'attendre à ce que les mêmes exceptions soient levées pour null; cependant, ces API sont très anciennes et peuvent ne pas pouvoir être modifiées à ce stade.

Et:

Étant donné que le comportement d'exception est ancien et spécifié dans JavaDoc, il est impossible de modifier le comportement de l'une ou l'autre des méthodes pour le moment. Fermer car ne résoudra pas.

Tiré de: Rapport bogue: Integer.parseInt () et Double.parseDouble () throw différentes exceptions sur null.

Comme d'autres l'ont déclaré: il est probablement fait par différents auteurs.

Floris Velleman
la source
2
Rapport de bogue connexe et intéressant: bugs.sun.com/view_bug.do?bug_id=6463998 On dirait que dans Java 6, la méthode d'analyse de la classe Double / Float lance NPE.
nhahtdh
2
De manière amusante, le commentaire disait que cette fonctionnalité était "très ancienne" à l'époque, et c'était il y a 15 ans maintenant.
Southpaw Hare
Cette incohérence provient très probablement de Java 1.0. Malheureusement, il serait difficile de vérifier cela. Je ne pense pas que Java 1.0 soit disponible au téléchargement, et vous auriez besoin d'une boîte Windows 95 / NT pour l'exécuter. Ou une ancienne machine SPARC.)
Stephen C
59

Remarque: tout dans ce post est dans le source de Java7-b147

Double.parseDouble()entre dans une bibliothèque Sun (dans sun.misc.FloatingDecimal) la première chose importante qui se produit est:

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

Integer.parseInt()se fait manuellement dans la Integerclasse. La première chose importante qui se produit est:

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

Je suppose qu'il y a deux auteurs différents.

durron597
la source