บ่อยครั้งที่เราเขียนโปรแกรมที่เกี่ยวกับการคำนวณตัวเลขต่างๆ ไปๆมาๆ เกิด Exception ตัวอย่าง เช่น
Exception in thread "main" java.lang.NumberFormatException: Infinite or NaN at java.math.BigDecimal.(Unknown Source)
สาเหตุของปัญหานี้ คือ การคำนวณแล้วเกิด NaN ซึ่งเป็น NumberFormatException อยากรู้ว่าน้อง NaN คือ อะไร สามารถอ่านต่อได้เลยครับ
NaN คือ อะไร
- NaN ย่อมาจาก not a number แปลตรงตัวเลย คือว่า มันไม่เป็นตัวเลข
การเกิดNaN มักจะเกิดจากอะไร
- ใช้ค่าที่ไม่เหมาะสมกับ method หรือ ตามหลักการที่ควรจะเป็น เช่น root ไม่ควรติดลบ
- อาจจะเกิดจากการ overflow ขึ้นของชนิดข้อมูลนั้นๆ
- การจัดเก็บข้อมูลที่เพี้ยนไปในรูปแบบ IEEE Standard for Floating-Point Arithmetic (IEEE 754) ของพวกกลุ่มทศนิยม float ,double เช่น 0.00 ในคอมอาจะเก็บเป็น 0.00000000000000000000000000001 ทำให้ค่าที่ได้ มีค่าไม่เท่ากับ 0
การแก้ไข
- ใช้ method isNaN ซึ่งเป็น Method ที่อยู่ใ DataType ชนิดตัวเลขอยู่แล้ว เช่น Float, Double, BigDecimal เป็นต้น โดยมีการคืนค่ากลับมาในรูปของ boolean (true, false)
- วิธีใช้ให้ดูจาก code ด้านล่างนี้ จากนั้นก็สร้าง Exception ขึ้นมาในการจัดการข้อผิดพลาดนี้ โดยถ้าพบว่า ผลการคำนวณเป็น NaN ให้โปรแกรม throw Exception เพื่อไปจัดการในส่วนของ Catch ในการแสดง Message บอกใช้ผู้ใช้งานรู้
public static void main(String[] args) { ...... try{ ...... x1 = ((-b)+root)/down; //ใช้ method isNaN ในการตรวจสอบค่าของ x1 ซึ่งมีชนิดข้อมูลแบบ Double ว่าเกิด NaN หรือไม่ if(Double.isNaN(x1)){ throw new ArithmeticException(); //ถ้าใช่ก็จะสร้าง ArithmeticException() แล้วโยนไปให้ส่วน catch จัดการ } }catch(ArithmeticException e){ JOptionPane.showMessageDialog(null,"ArithmeticException: "+e.getMessage()); }catch(NumberFormatException e){ JOptionPane.showMessageDialog(null,"NumberFormatException: "+e.getMessage()); }catch(Exception e){ JOptionPane.showMessageDialog(null,"Error: "+e.getMessage()); } }
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.