เมื่อวานเห็น code ที่น่าสนใจเกี่ยวกับเรื่อง Null Pointer Exception (NPE)
มีทั้งทำให้เกิด หรือ ไม่เกิด
แต่ประเด็นเหล่านั้นไม่น่าสนใจเท่ากับว่า
วันนี้ Java Developer ทำการจัดการกับ NPE กันอย่างไร ?

โดยปกติแล้ว NPE จะถูกโยนออกมาเมื่อ

ทำการเรียกใช้งานหรือเข้าถึง object ที่อ้างอิงไปยัง null
ที่สำคัญ NPE มันคือ RuntineException ด้วย (Unchecked Exception)
นั่นหมายความว่าจะไม่เกิดตอน compile time
ดังนั้น compiler จะไม่ทำการเตือนนะ
จะเกิดตอน runtime หรือตอนที่ทำงานจริง ๆ !!
น่ากลัวมาก ๆ

ใครบ้างที่เจอ NPE บน production ?
แต่น่าจะเป็นคำถามที่ผิด
น่าจะต้องถามใหม่ว่า ใครไม่เคยเจอบ้าง ?

คำถามที่น่าสนใจกว่าคือ จัดการกับ NPE กันอย่างไร ?

วิธีการที่ 1 เห็นได้ทั่วไป มันดักทุกสิ่งอย่าง

บางครั้งไม่รู้ด้วยซ้ำว่าจะดักอะไร
แต่เพื่อความสบายใจใส่ไว้ก่อน

วิธีการที่ 2 ตรวจสอบก่อนใช้งานเสมอ

เราจะพบเจอ code เหล่านี้ได้เกลื่อนกลาดในระบบ
เรียกว่าลูกอีช่าง if

วิธีการที่ 3 บางคนบอกว่า if-else มันยาวไป ดังนั้นใช้ Ternary operator ก็แล้วกัน

ไม่รู้ว่ามันจะแถไปไหน !!

วิธีการที่ 4 รู้ไหมว่า method equals() ถ้าใช้ถูกวิธีมันจะไม่โยน NPE ออกมานะ

ตัวอย่างของการใช้ที่ผิด ก่อให้เกิด NPE ได้ ถ้าไม่ระวัง

ตามจริง compiler มันจะด่านะ ถ้าตอน compile เพิ่ม -Xlint:all เข้าไป
หรือถ้าใช้ IDE ดี ๆ มันก็แสดง warning เหลืองด่าอีกด้วย
แต่เท่าที่เจอ Developer จะหน้ามึน ทำเป็นมองไม่เห็น
แสดงดังรูป

ดังนั้นแก้ไขใหม่ซะ จะเป็นดังนี้

แต่ถ้าใช้ IDE ดี ๆ มันก็จะแนะนำวิธีการแก้ไขให้เพียบนะครับ
เอาที่สบายใจกันได้เลย ดังรูป

วิธีการที่ 5 รู้ไหมว่า String.valueOf() มันไม่โยน NPE ออกมานะ !!

แต่ส่งค่า String “null” ออกมาแทนนะ
แต่ถ้าใช้งาน toString() ก็บ้านใครบ้านมัน

วิธีการที่ 6 สำหรับ method ที่ต้อง return ค่ากลับ จะส่ง null กลับมาทำโล่ห์ทำพระแสงอะไร ?

คนเรียกใช้ต้องมาเสียเวลาตรวจสอบ null อีก
ไม่รู้สึกเบื่อหน่ายกันบ้างเลยหรือไง ?

ตัวอย่าง ถ้า method ต้อง return ค่าเป็น Collection ออกมา
ถ้าไม่มีค่าก็ส่งเป็น Collection ว่าง ๆ กลับมาสิ

สำหรับข้อมูลที่เป็นพวก Map ก็ให้ใช้ containsKey() ก่อนจะดึงข้อมูลนะ
ไม่งั้นเดี๋ยวจะเกิด NPE เอาอีกได้

วิธีการที่ 7 ถ้าสาย Java 8 ก็ Optional สิครับ

ว่าแต่ที่ไหนยังไม่ใช้ Java 8 กันบ้างนะ ?
หรือ Java Developer บางคนอาจจะถามว่า ใครเขาใช้กัน ?

เรื่องพื้นฐานผ่านไป แล้วมันมีวิธีการอะไรอีก ?

  • Assertion ไปเลย
  • ใช้ Library ต่าง ๆ เพิ่ม ที่เห็นใช้บ่อย ๆ ก็เช่น StringUtils จาก Apache Common และ Guice เป็นต้น
  • ใช้ singleton pattern !!
  • ไปเขียน Kotlin กัน
  • อื่น ๆ อีกมากมาย

ขอปิดท้ายด้วยวิธีการที่ขาดไม่ได้เลยคือ เขียน Unit test สิครับ

เพื่อตรวจสอบว่า code ที่เราเขียนขึ้นมา
มันโยน NPE ออกมาหรือไม่ ตามที่คาดหวัง
รออะไรไปเขียน code กัน

วิธีการเยอะนะ เพราะว่าด้วยตัวภาษานั่นเอง
แต่ในฐานะของนักพัฒนาก็ต้องเรียนรู้ในภาษาที่เราใช้งานเป็นอย่างดีนะครับ
แล้วชีวิตจะดีขึ้นอีกเป็นกองครับ
อ่าน ลงมือฝึกฝนและเรียนรู้อยู่ตลอดเวลาครับ
พื้นฐานมันสำคัญมาก ๆ

ขอให้สนุกกับการเขียน code นะ

Tags: