Android Academy · บทเรียน

ชนิดข้อมูลที่อาจเป็นค่าว่างเทียบกับไม่เป็นค่าว่าง

เครื่องหมายชนิดข้อมูล ?

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

ชนิดข้อมูลที่อาจเป็นค่าว่างเทียบกับไม่เป็นค่าว่าง เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดความปลอดภัยของค่า Null จึงสำคัญ

ข้อขัดข้องจำนวนมากในแอป Android เกิดจากความผิดพลาดอย่างหนึ่ง นั่นคือการใช้ค่าที่ไม่มีอยู่จริง ในภาษาอื่น สิ่งนี้อาจกลายเป็น NullPointerException ที่น่ากังวลขณะทำงาน

Kotlin จัดการเรื่องนี้ตั้งแต่เวลาคอมไพล์ ระบบชนิดข้อมูลจะติดตามว่าค่าใดอาจเป็น null และค่าใดไม่มีทางเป็นได้ บทเรียนนี้จะแนะนำพื้นฐานของระบบดังกล่าว

ชนิดข้อมูลที่ไม่เป็น Null

โดยค่าเริ่มต้น ชนิดข้อมูลของ Kotlin ไม่สามารถเก็บค่า null ได้ String จะชี้ไปยังสตริงจริงเสมอ

หากคุณพยายามกำหนด null ให้ตัวแปรนี้ โค้ดจะคอมไพล์ไม่ผ่าน นี่คือค่าเริ่มต้นที่ปลอดภัย

fun main() {
    val name: String = "Ada"
    println(name.length)
}

Null ถูกปฏิเสธ

ดูสิ่งที่จะเกิดขึ้นเมื่อคุณพยายามใส่ null ลงในชนิดข้อมูลที่ไม่เป็น Null

คอมไพเลอร์จะหยุดคุณทันที คุณจะไม่ไปถึงเวลาทำงานพร้อมข้อผิดพลาดที่ซ่อนอยู่

val name: String = null  // Compile error:
// Null can not be a value of a non-null type String

ชนิดข้อมูลที่อาจเป็น Null ด้วย ?

บางครั้งค่าอาจไม่มีอยู่จริง เช่น ชื่อกลางของผู้ใช้ที่เป็นข้อมูลเสริม คุณเลือกให้เป็นค่าอาจเป็น Null ได้โดยเติม ? ต่อท้ายชนิดข้อมูล

String? สามารถเก็บสตริงจริงหรือ null ได้ เครื่องหมายคำถามจะระบุว่าชนิดข้อมูลนี้อาจเป็น Null

fun main() {
    val middleName: String? = null
    println(middleName)
}

ชนิดข้อมูลสองแบบที่แตกต่างกัน

String และ String? ไม่ใช่ชนิดข้อมูลเดียวกัน แบบที่สองเป็นชนิดข้อมูลที่กว้างกว่าและรวมค่า null ไว้ด้วย

ความแตกต่างนี้ทำให้คอมไพเลอร์ช่วยปกป้องคุณได้ เพราะคอมไพเลอร์รู้แน่ชัดว่า null อาจปรากฏที่ใด

val sure: String = "hello"
val maybe: String? = "hello"
// maybe could later be null; sure never can

คุณใช้ค่าที่อาจเป็น Null โดยตรงไม่ได้

คอมไพเลอร์จะไม่อนุญาตให้คุณเรียกเมธอดกับค่าที่อาจเป็น Null โดยไม่ตรวจสอบก่อน

เนื่องจาก middleName อาจเป็น null การเรียก .length กับค่าดังกล่าวจึงทำให้เกิดข้อผิดพลาดขณะคอมไพล์ คุณต้องจัดการกรณีที่เป็น Null

val middleName: String? = null
println(middleName.length)
// Error: only safe (?.) or non-null (!!) calls allowed

การตรวจสอบด้วย if

วิธีที่ง่ายที่สุดในการใช้ค่าที่อาจเป็น Null คือการตรวจสอบด้วยเงื่อนไข if

ภายในแขนงที่คุณพิสูจน์แล้วว่าค่าไม่เป็น Null Kotlin จะแปลงชนิดข้อมูลให้เป็นชนิดที่ไม่เป็น Null โดยอัตโนมัติ ทำให้ใช้ .length ได้

fun main() {
    val text: String? = "Kotlin"
    if (text != null) {
        println(text.length)
    }
}

การแปลงชนิดอัจฉริยะ

หลังจากตรวจสอบ Null สำเร็จ คอมไพเลอร์จะจำไว้ว่าค่านั้นไม่เป็น Null ตลอดบล็อกที่เหลือ สิ่งนี้เรียกว่าการแปลงชนิดอัจฉริยะ

คุณไม่ต้องเขียนการแปลงชนิดใด ๆ เพราะ Kotlin ติดตามให้โดยอัตโนมัติ

fun describe(s: String?) {
    if (s == null) return
    // s is now treated as String here
    println("Length is " + s.length)
}

พารามิเตอร์ของฟังก์ชัน

การที่พารามิเตอร์อาจเป็น Null หรือไม่ ถือเป็นส่วนหนึ่งของสัญญาของฟังก์ชัน พารามิเตอร์ที่ไม่เป็น Null รับประกันกับผู้เรียกว่าจะไม่รับค่า null

พารามิเตอร์ที่อาจเป็น Null บอกว่าฟังก์ชันคาดว่าจะได้รับข้อมูลที่ขาดหายและจะจัดการกับกรณีนี้

fun greet(name: String) {
    println("Hi, " + name)
}
// greet(null) would not compile

ชนิดข้อมูลที่ส่งคืนอาจเป็น Null ได้

ฟังก์ชันอาจส่งคืน null เพื่อบอกว่าไม่พบสิ่งใด ให้เติม ? ในชนิดข้อมูลที่ส่งคืน

จากนั้นผู้เรียกจะทราบว่าต้องตรวจสอบผลลัพธ์ก่อนใช้งาน

fun firstChar(s: String): Char? {
    if (s.isEmpty()) return null
    return s[0]
}

กำหนดให้ไม่เป็น Null เป็นค่าเริ่มต้น

หลักปฏิบัติที่ดีคือให้เลือกชนิดข้อมูลที่ไม่เป็น Null เติม ? เฉพาะเมื่อค่าดังกล่าวอาจไม่มีอยู่จริง

วิธีนี้ช่วยให้โค้ดตรงตามความเป็นจริง ยิ่งมีชนิดข้อมูลที่อาจเป็น Null น้อยเท่าไร ก็ยิ่งต้องตรวจสอบ Null น้อยลงในภายหลัง

// Prefer this:
val score: Int = 0
// Over this, unless null is meaningful:
val maybeScore: Int? = null

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับชนิดข้อมูลที่อาจเป็น Null และชนิดข้อมูลที่ไม่เป็น Null

สรุปทบทวน

ชนิดข้อมูลของ Kotlin ไม่เป็น Null โดยค่าเริ่มต้น และปฏิเสธ null ตั้งแต่เวลาคอมไพล์ เติม ? เพื่อทำให้ชนิดข้อมูลอาจเป็น Null ได้เมื่อค่าอาจไม่มีอยู่

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

เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
36
บทเรียน
152

คำถามที่พบบ่อย

บทเรียน “ชนิดข้อมูลที่อาจเป็นค่าว่างเทียบกับไม่เป็นค่าว่าง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ชนิดข้อมูลที่อาจเป็นค่าว่างเทียบกับไม่เป็นค่าว่าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ชนิดข้อมูลที่อาจเป็นค่าว่างเทียบกับไม่เป็นค่าว่าง”

เครื่องหมายชนิดข้อมูล ? คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ชนิดข้อมูลที่อาจเป็นค่าว่างเทียบกับไม่เป็นค่าว่าง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม

ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ชนิดข้อมูลที่อาจเป็นค่าว่างเทียบกับไม่เป็นค่าว่าง
  2. การเรียกอย่างปลอดภัยและ Elvis
  3. ฟังก์ชัน let, also และ scope
  4. หลีกเลี่ยง NullPointerExceptions
← กลับไปที่ Android Academy