ชนิด Nullable และตัวปรับแต่ง ?
ประกาศตัวแปร nullable และทำความเข้าใจความปลอดภัยจากค่า null ของ Kotlin ตั้งแต่เวลาคอมไพล์
ชนิด Nullable และตัวปรับแต่ง ? เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
ความปลอดภัยจากค่าว่างใน Kotlin
Kotlin แยกประเภทที่เก็บค่าว่างได้ออกจากประเภทที่เก็บค่าว่างไม่ได้ตั้งแต่เวลาคอมไพล์ คอมไพเลอร์จะป้องกัน NullPointerExceptions ส่วนใหญ่ได้ก่อนรันโปรแกรม
ชนิดที่ไม่เป็นค่าว่าง
โดยค่าเริ่มต้น ชนิดข้อมูลของ Kotlin ไม่สามารถเป็นค่าว่างได้ หากลองกำหนดค่าว่างให้กับชนิดข้อมูล คอมไพเลอร์จะปฏิเสธ
fun main() {
val name: String = "Ada"
// val nope: String = null // ERROR
println(name)
}ชนิดที่รับค่าว่างได้ด้วย ?
เติม ? เพื่ออนุญาตให้เป็นค่าว่างได้ จากนั้นคอมไพเลอร์จะถือว่าตัวแปรนั้นอาจไม่มีค่า
fun main() {
val name: String? = null
println(name) // null
}การเรียกเมธอดกับค่าที่อาจเป็นค่าว่าง
คุณไม่สามารถเรียกเมธอดกับค่าที่อาจเป็นค่าว่างได้โดยตรงโดยไม่จัดการกรณีที่เป็นค่าว่างก่อน คอมไพเลอร์จะปฏิเสธการทำงานดังกล่าว
fun main() {
val name: String? = "Bob"
// println(name.length) // ERROR — name might be null
if (name != null) println(name.length) // smart cast
}การแปลงชนิดอัจฉริยะ
หลังจากตรวจสอบด้วย if (x != null) แล้ว Kotlin จะแปลงชนิดของ x เป็นชนิดที่ไม่เป็นค่าว่างโดยอัตโนมัติภายในแขนงนั้น
fun main() {
val name: String? = "Alice"
if (name != null) {
println("Length: ${name.length}") // safe, smart-cast
} else {
println("No name")
}
}พารามิเตอร์ฟังก์ชันที่รับค่าว่างได้
กำหนดพารามิเตอร์ฟังก์ชันให้รับค่าว่างได้เมื่อพารามิเตอร์นั้นอาจไม่มีค่า ผู้เรียกจะต้องส่งค่าหรือค่าว่างมาอย่างชัดเจน
fun greet(name: String?) {
if (name == null) println("Hello, stranger")
else println("Hello, $name")
}
fun main() {
greet("Sara")
greet(null)
}ชนิดค่าที่ฟังก์ชันคืนซึ่งรับค่าว่างได้
ฟังก์ชันที่คืนค่า X? กำลังบอกผู้เรียกว่าผลลัพธ์อาจเป็นค่าว่าง ผู้เรียกจึงต้องจัดการกรณีนี้
fun findUser(id: Int): String? {
return if (id == 1) "Alice" else null
}
fun main() {
val u = findUser(2)
println(u ?: "no user")
}พร็อพเพอร์ตีที่รับค่าว่างได้
พร็อพเพอร์ตีของคลาสก็สามารถรับค่าว่างได้เช่นกัน ซึ่งพบได้บ่อยเมื่อฟิลด์ต่าง ๆ จะถูกเติมค่าภายหลังหรือถูกดึงมาแบบมีเงื่อนไข
data class Profile(
val name: String,
val avatarUrl: String?
)
fun main() {
val p = Profile("Lee", null)
println(p.avatarUrl ?: "(no avatar)")
}คอลเลกชันที่รับค่าว่างได้
โปรดแยกความแตกต่างระหว่างรายการที่อาจเป็นค่าว่าง List<T>? กับรายการที่สมาชิกแต่ละตัวอาจเป็นค่าว่าง List<T?> ทั้งสองแบบมีความหมายต่างกัน
fun main() {
val maybeList: List<Int>? = null
val listOfMaybe: List<Int?> = listOf(1, null, 3)
println(maybeList?.size) // null
println(listOfMaybe.size) // 3
}การเปรียบเทียบกับ Java
ชนิดข้อมูลของ Java ที่ส่งเข้ามาใน Kotlin จะปรากฏเป็น ชนิดข้อมูลจากแพลตฟอร์ม (String!) Kotlin จะเชื่อถือคุณ แต่ไม่มีการรับประกันความปลอดภัยจากค่าว่าง โปรดใส่คำกำกับ @Nullable/@NotNull ให้กับส่วนติดต่อ Java เสมอเมื่อทำได้
fun main() {
val maybeNull: String? = System.getenv("FOO") // null if unset
println("env FOO = ${maybeNull ?: "(unset)"}")
}เหตุผลที่เรื่องนี้สำคัญ
ความปลอดภัยจากค่าว่างขณะคอมไพล์ช่วยป้องกันการขัดข้องขณะรันโปรแกรมได้ทั้งกลุ่ม ใช้ตัวแก้ไข ? ให้เป็นประโยชน์ เพราะตัวแก้ไขนี้บอกเจตนาและบังคับให้จัดการกรณีค่าว่าง
fun divide(a: Int, b: Int): Int? = if (b == 0) null else a / b
fun main() {
val r1 = divide(10, 2) // 5
val r2 = divide(10, 0) // null — handled at call site
println("$r1, $r2")
}ตรวจสอบความเข้าใจ
เครื่องหมาย ? ที่ท้ายการประกาศชนิดข้อมูลหมายความว่าอย่างไร
สรุปทบทวน
โดยค่าเริ่มต้น ชนิดข้อมูลของ Kotlin จะไม่รับค่าว่าง เติม ? เพื่อเลือกให้รับค่าว่างได้ คอมไพเลอร์จะบังคับให้จัดการค่าว่างผ่านการแปลงชนิดอัจฉริยะ การเรียกแบบปลอดภัย และตัวดำเนินการ Elvis ซึ่งช่วยป้องกัน NullPointerExceptions ส่วนใหญ่ก่อนรันโปรแกรม
เรียนรู้ Kotlin ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 51
- บทเรียน
- 203
คำถามที่พบบ่อย
บทเรียน “ชนิด Nullable และตัวปรับแต่ง ?” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ชนิด Nullable และตัวปรับแต่ง ?” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ชนิด Nullable และตัวปรับแต่ง ?”
ประกาศตัวแปร nullable และทำความเข้าใจความปลอดภัยจากค่า null ของ Kotlin ตั้งแต่เวลาคอมไพล์ คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ชนิด Nullable และตัวปรับแต่ง ?” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ชนิด Nullable และตัวปรับแต่ง ?
- Safe Call ?. และ Elvis ?: ในโค้ดจริง
- let, also และ run กับตัวรับ Nullable
- ตัวดำเนินการ !!: เมื่อใดและเหตุใดควรหลีกเลี่ยง