ค่อนข้างเป็นคำถามโง่ ๆ ให้รหัส:
public static int sum(String a, String b) /* throws? WHAT? */ {
int x = Integer.parseInt(a); // throws NumberFormatException
int y = Integer.parseInt(b); // throws NumberFormatException
return x + y;
}
คุณช่วยบอกได้ไหมว่าเป็น Java ที่ดีหรือไม่? สิ่งที่ฉันกำลังพูดถึงคือNumberFormatException
เป็นข้อยกเว้นที่ไม่ได้ตรวจสอบ คุณไม่จำเป็นต้องระบุว่าเป็นส่วนหนึ่งของsum()
ลายเซ็น นอกจากนี้เท่าที่ผมเข้าใจความคิดของข้อยกเว้นไม่ถูกตรวจสอบเป็นเพียงสัญญาณว่าการดำเนินการของโปรแกรมไม่ถูกต้องและมากยิ่งขึ้นจับข้อยกเว้นไม่ถูกตรวจสอบเป็นความคิดที่ไม่ดีเพราะมันก็เหมือนกับการแก้ไขโปรแกรมที่ไม่ดีที่รันไทม์
ใครช่วยชี้แจงได้ไหมว่า:
- ฉันควรระบุ
NumberFormatException
เป็นส่วนหนึ่งของลายเซ็นของเมธอด - ฉันควรกำหนดข้อยกเว้นการตรวจสอบของตัวเอง (
BadDataException
) จับภายในวิธีการและอีกครั้งโยนมันเป็นNumberFormatException
BadDataException
- ฉันควรกำหนดข้อยกเว้นการตรวจสอบของฉันเอง (
BadDataException
) ตรวจสอบความถูกต้องของสตริงทั้งสองด้วยวิธีใดวิธีหนึ่งเช่นนิพจน์ทั่วไปและโยนของฉันBadDataException
หากไม่ตรงกัน - ความคิดของคุณ?
อัปเดต :
ลองนึกภาพว่ามันไม่ใช่กรอบงานโอเพนซอร์สที่คุณควรใช้ด้วยเหตุผลบางประการ คุณดูลายเซ็นของวิธีการและคิดว่า - "ตกลงมันไม่เคยพ่น" จากนั้นวันหนึ่งคุณมีข้อยกเว้น เป็นเรื่องปกติ?
อัปเดต 2 :
มีบางความคิดเห็นบอกว่าของฉันsum(String, String)
ออกแบบไม่ดี ฉันเห็นด้วยอย่างยิ่ง แต่สำหรับผู้ที่เชื่อว่าปัญหาดั้งเดิมจะไม่ปรากฏหากเรามีการออกแบบที่ดีคำถามเพิ่มเติมมีดังนี้:
นิยามปัญหาเป็นเช่นนี้คุณมีแหล่งข้อมูลที่จัดเก็บตัวเลขเป็นString
s แหล่งที่มานี้อาจเป็นไฟล์ XML หน้าเว็บหน้าต่างเดสก์ท็อปพร้อมช่องแก้ไข 2 ช่องอะไรก็ได้
เป้าหมายของคุณคือใช้ตรรกะที่ใช้ 2 String
s นี้แปลงเป็นint
s และแสดงกล่องข้อความว่า "ผลรวมเท่ากับ xxx"
ไม่ว่าคุณจะใช้แนวทางใดในการออกแบบ / ใช้งานสิ่งนี้คุณจะมีฟังก์ชันภายใน 2 จุดเหล่านี้ :
- สถานที่ที่คุณแปลง
String
เป็นint
- สถานที่ที่คุณเพิ่ม 2
int
วินาที
คำถามหลักของโพสต์เดิมของฉันคือ:
Integer.parseInt()
คาดว่าถูกต้องสตริงที่จะผ่าน เมื่อใดก็ตามที่คุณส่งสตริงที่ไม่ถูกต้องหมายความว่าโปรแกรมของคุณไม่ถูกต้อง (ไม่ใช่ " ผู้ใช้ของคุณงี่เง่า") คุณจำเป็นต้องใช้ชิ้นส่วนของรหัสที่อยู่ในมือคนที่คุณมี Integer.parseInt () มีความหมายต้องและในมืออื่น ๆ ที่คุณจะต้องมีการตกลงกับกรณีเมื่อป้อนข้อมูลไม่ถูกต้อง - ความหมายควร
ดังนั้นโดยย่อ: ฉันจะใช้ความหมายได้อย่างไรหากฉันต้องมีไลบรารีเท่านั้น