0Pricing
Android Academy · บทเรียน

การเรียกอย่างปลอดภัยและ Elvis

ตัวดำเนินการ ?. และ ?:

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

นอกเหนือจากการตรวจสอบด้วย if

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

บทเรียนนี้ครอบคลุมตัวดำเนินการเรียกอย่างปลอดภัย ?. และตัวดำเนินการ Elvis ?: ซึ่งเป็นเครื่องมือสองอย่างที่คุณจะใช้บ่อยมาก

ตัวดำเนินการเรียกอย่างปลอดภัย

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

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

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

การเรียกอย่างปลอดภัยกับค่า Null

เมื่อค่าที่อยู่ทางซ้ายเป็น Null การเรียกอย่างปลอดภัยจะหยุดทำงานต่อและส่งคืน null โดยไม่มีการโยนข้อยกเว้น

ในตัวอย่างนี้ ผลที่พิมพ์ออกมาคือคำว่า null ไม่ใช่ข้อขัดข้อง

fun main() {
    val name: String? = null
    println(name?.length)  // prints: null
}

การเชื่อมต่อการเรียกอย่างปลอดภัย

คุณสามารถเชื่อมต่อ ?. หลายขั้นตอนได้ หากส่วนใดส่วนหนึ่งเป็น Null การเชื่อมต่อทั้งหมดจะหยุดและให้ผลเป็น null

วิธีนี้เหมาะอย่างยิ่งสำหรับเข้าถึงข้อมูลเสริมที่ซ้อนกันหลายระดับ

class Address(val city: String?)
class User(val address: Address?)

fun cityOf(u: User?): String? {
    return u?.address?.city
}

ตัวดำเนินการ Elvis

ตัวดำเนินการ Elvis ?: จะจัดหาค่าสำรองเมื่อค่าด้านซ้ายเป็น Null ชื่อนี้มาจากทรงผมของนักร้องที่มีรูปร่างคล้ายสัญลักษณ์ดังกล่าว

ให้อ่านว่า ใช้ค่าด้านซ้าย หรือใช้ค่าด้านขวาแทน

fun main() {
    val name: String? = null
    val shown = name ?: "Guest"
    println(shown)  // prints: Guest
}

Elvis กับการเรียกอย่างปลอดภัย

การเรียกอย่างปลอดภัยและ Elvis ทำงานร่วมกันได้ดี ใช้ ?. เพื่อเข้าถึงค่าภายใน และใช้ ?: เพื่อกำหนดค่าเริ่มต้นหากส่วนใดเป็น Null

รูปแบบนี้เปลี่ยนผลลัพธ์ที่อาจเป็น Null ให้เป็นค่าที่รับประกันว่าไม่เป็น Null

fun main() {
    val name: String? = null
    val len: Int = name?.length ?: 0
    println(len)  // prints: 0
}

ตัวอย่างความยาวพร้อมค่าเริ่มต้น

ชนิดข้อมูลของผลลัพธ์ในที่นี้คือ Int ธรรมดา ไม่ใช่ Int? ตัวดำเนินการ Elvis ได้กำจัดความเป็น Null ออกไปแล้ว

หลังใช้ ?: พร้อมค่าสำรองที่ไม่เป็น Null คอมไพเลอร์จะทราบว่าค่านั้นไม่มีทางเป็น Null

val title: String? = "Kotlin"
val length: Int = title?.length ?: 0
// length is a non-null Int

ใช้ Elvis เพื่อส่งคืนก่อนกำหนด

เนื่องจาก return และ throw เป็นนิพจน์ใน Kotlin คุณจึงวางไว้ทางขวาของ Elvis ได้

นี่เป็นวิธีที่สะอาดในการออกจากฟังก์ชันก่อนกำหนดเมื่อค่าที่จำเป็นไม่มีอยู่

fun process(input: String?) {
    val text = input ?: return
    println(text.uppercase())
}

การเรียกอย่างปลอดภัยกับ let

ใช้ ?. ร่วมกับ let เพื่อเรียกใช้บล็อกเฉพาะเมื่อค่าไม่เป็น Null ภายในบล็อก ค่าจะไม่เป็น Null และมีชื่อว่า it

นี่เป็นรูปแบบสำนวนที่ใช้กันทั่วไปเมื่อต้องดำเนินการกับค่าที่อาจไม่มีอยู่

fun main() {
    val email: String? = "a@b.com"
    email?.let {
        println("Sending to " + it)
    }
}

นำทุกอย่างมารวมกัน

โปรแกรมสั้น ๆ สามารถแสดงให้เห็นว่าการเรียกอย่างปลอดภัยและ Elvis ทำงานร่วมกันเพื่อสร้างข้อความที่เป็นมิตรได้อย่างไร

สังเกตว่าไม่จำเป็นต้องใช้คำสั่ง if แต่โค้ดก็ยังไม่มีความเสี่ยงที่จะขัดข้องจากค่า Null

fun main() {
    val nickname: String? = null
    val display = nickname?.uppercase() ?: "ANONYMOUS"
    println(display)
}

ควรใช้แบบใดเมื่อไร

ใช้ ?. เมื่อต้องการให้ผลลัพธ์ที่เป็น Null ไหลต่อไปโดยไม่ก่อปัญหา ใช้ ?: เมื่อต้องการแทนที่ Null ด้วยค่าเริ่มต้นที่ชัดเจน

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

val count = list?.size ?: 0
// safe call reads size, Elvis defaults to 0

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

ทดสอบความเข้าใจเกี่ยวกับการเรียกอย่างปลอดภัยและตัวดำเนินการ Elvis

สรุปทบทวน

การเรียกอย่างปลอดภัย ?. จะเรียกใช้สมาชิกก็ต่อเมื่อค่าที่เรียกไม่เป็น Null มิฉะนั้นจะให้ผลเป็น null ส่วนตัวดำเนินการ Elvis ?: จะแทนที่ Null ด้วยค่าสำรอง

การเชื่อมต่อทั้งสองอย่างช่วยจัดการความเป็น Null ได้อย่างสะอาด ต่อไปคุณจะได้ศึกษาเพิ่มเติมเกี่ยวกับฟังก์ชันขอบเขต เช่น let และ also

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

บทเรียน “การเรียกอย่างปลอดภัยและ Elvis” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การเรียกอย่างปลอดภัยและ Elvis”

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

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

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

บทเรียน “การเรียกอย่างปลอดภัยและ Elvis” ใช้เวลานานแค่ไหน

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

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

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

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

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