Double.parseDouble (null) ve Integer.parseInt (null) neden farklı istisnalar atıyor?


93

Double.parseDouble (null) ve Integer.parseInt (null) neden farklı istisnalar atıyor?

Bu tarihi bir kaza mı yoksa kasıtlı mı? Dokümantasyon açık bir şekilde için Double.parseDouble(...)ve biri için iki tür istisna belirtiyor Integer.parseInt(), ancak tutarsız görünüyor:

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

ancak

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


2
İlgili yöntemlerin kaynak kodunu kontrol etmek, sadece bir tutarsızlık gibi görünüyor. parseDoubleboş bir denetim yapmaz ve karşılaşıldığında sadece bir NPE atar, ancak içinde parseInt, daha sonra girdi dizesi için kontrol edilir null. Neden farklı davranmaları için iyi bir neden göremiyorum.
NilsH

AynıNumberFormatException'ı attıklarını kontrol ettim.
twlkyao

Yanıtlar:


68

Aynı istisnaların boş olarak atılmasını beklemek mantıklıdır; ancak bu API'ler çok eskidir ve bu noktada değiştirilemeyebilir.

Ve:

İstisna davranışı uzun süredir devam ettiği ve JavaDoc'ta belirtildiği için, şu anda her iki yöntemin davranışını değiştirmek pratik değildir. Düzeltmeyeceği gibi kapatmak.

Şu kaynaktan alınmıştır: Hata Raporu: Integer.parseInt () ve Double.parseDouble () null üzerinde farklı istisnalar atar.

Diğerlerinin de belirttiği gibi: Muhtemelen farklı yazarlar tarafından yapılmıştır.


2
İlgili ve ilginç hata raporu: bugs.sun.com/view_bug.do?bug_id=6463998 Java 6'daki gibi görünüyor, Double / Float sınıfından ayrıştırma yöntemi NPE atıyor.
nhahtdh

2
Eğlenceli, yorum bu işlevsellik "çok eski" olduğunu söyledi anda ve şimdi 15 yıl önceydi.
Southpaw Hare

Bu tutarsızlık büyük olasılıkla Java 1.0'dan kaynaklanmaktadır. Ne yazık ki bunu doğrulamak zor olacak. Java 1.0'ın indirilebilir olduğunu düşünmüyorum ve çalıştırmak için bir Windows 95 / NT kutusuna ihtiyacınız var. Veya eski bir SPARC makinesi.)
Stephen C

59

Not: Bu gönderideki her şey Java7-b147 kaynağındadır

Double.parseDouble()bir Sun kitaplığına (girişine) girdiğinde sun.misc.FloatingDecimalgerçekleşen ilk önemli şey şudur:

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

Integer.parseInt()Integersınıfta elle yapılır . Olan ilk önemli şey şudur:

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

Sanırım iki farklı yazar var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.