Kotlin Academy · บทเรียน

ชนิด Nullable และตัวปรับแต่ง ?

ประกาศตัวแปร nullable และทำความเข้าใจความปลอดภัยจากค่า null ของ Kotlin ตั้งแต่เวลาคอมไพล์

บทเรียน 1 จาก 413 ขั้นตอน

ชนิด 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ชนิด Nullable และตัวปรับแต่ง ?
  2. Safe Call ?. และ Elvis ?: ในโค้ดจริง
  3. let, also และ run กับตัวรับ Nullable
  4. ตัวดำเนินการ !!: เมื่อใดและเหตุใดควรหลีกเลี่ยง
← กลับไปที่ Kotlin Academy