เมื่อวานเห็น 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 นะ