เหตุใด Double.parseDouble (null) และ Integer.parseInt (null) จึงมีข้อยกเว้นที่แตกต่างกัน


93

เหตุใด 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

ฉันตรวจสอบแล้วว่าพวกเขาโยน sameNumberFormatException
twlkyao

คำตอบ:


68

มีความสมเหตุสมผลที่จะคาดหวังว่าข้อยกเว้นเดียวกันจะถูกโยนทิ้งให้เป็นโมฆะ อย่างไรก็ตาม 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 โบราณ)
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.