Kotlin can be Null

Christopher Hay-Yin Ng
Black Lens
Published in
1 min readAug 2, 2017

--

Kotlin เป็น null safety language นี้คือสิ่งที่เราเชื่อเสมอมา ถ้าเราไม่เปิดให้มันเป็น optional แล้ว มันไม่ควรจะเกิด null ขึ้น

เราสร้าง app ด้วยความมั่นใจนี้มาตลอดจนกระทั่งวันนึง สิ่งที่ไม่คาดคิดก็บังเกิด

เฮ้ย ทำไม property นี้มันเป็น null!!!

นี้คืออาการที่ผมงงงวยขั้นสุด เมื่อต้องมาเจอ property ที่ผมสร้างไว้เป็น null ทั้งที่มันไม่ควรเกิดขึ้นได้ เสียเวลาพักใหญ่ในการไล่ตามหา bug ว่าเป็นไปได้ยังไง

// Data class ที่เตรียมไว้
data class Model(val a: String = "", val b: String = "")
// JSON ที่ได้รับ
{ b: null }
// Object ที่ออกมา
Model(a="", b=null)

อาการนี้เกิดขึ้นเมื่อผมทำการเรียกใช้ property นั้น ซึ่งมาจาก object ที่ถูก serialize ด้วย GSON แต่ว่าค่าของ property นั้นดันเป็น null ใน JSON ซึ่งผมก็คิดว่ามันก็ควรจะเป็น default value ที่เตรียมไว้สิ

แต่มันไม่เป็นเช่นนั้นครับ

สิ่งใดๆที่ถูก serialize โดย GSON แล้วถ้าค่าเป็น null ค่าของ property นั้นจะกลายร่างเป็น null ทันที หรือถ้าลองใช้ lib อื่นอย่าง Moshi ก็จะระเบิดฟ้อง Exception แทน

อาการนี้เกิดจากการทำ reflection ของ Java ซึ่งการเกิด null เป็นเรื่องที่รับได้ นั้นหมายความว่า lib อื่นๆที่เกี่ยวข้องกับ reflection นั้นมีโอกาสสูงที่จะที่ทำให้ค่าเกิด null โดยที่เราไม่รู้ตัวได้เสมอ

Workaround

วิธีการแก้ไขก็คงต้องไล่ตามเช็คว่าค่านั้นจะมีโอกาสเกิด null หรือไม่ ถ้าใช่ก็กำหนดค่าให้มันซะ สำหรับ GSON ผมใช้วิธีตามนี้

นี้เป็นตัวอย่างนึงของการเกิด null อย่างไม่คาดคิด ถ้าเพื่อนๆพบเจอหรือมีวิธีแก้ไขปัญหานี้ยังไง อย่าลืมมาเล่าสู่กันฟังนะครับ

--

--