เมื่อใดก็ตามที่ฉันโทรออกหนึ่งครั้งโดยอ้างว่าไม่เป็นค่าว่าง android studio จะลบคำเตือนออกจากตัวแปรเดียวกันอื่น ๆ

เมื่อใดก็ตามที่ฉันพยายามสร้างตัวแปรบูลีนหลายตัวภายในฟังก์ชันซึ่งมี e: Entry? ในตัวสร้างของมัน android studio แจ้งให้ฉันทราบว่าอนุญาตให้เฉพาะการโทรที่ปลอดภัยหรือไม่เป็นโมฆะเท่านั้น ดังนั้นเมื่อใดก็ตามที่ฉันโทรออกหนึ่งครั้งโดยอ้างว่าไม่เป็นค่าว่าง android studio จะลบคำเตือนนี้ออกจากตัวแปรอื่น ๆ และโค้ดก็ใช้งานได้ ทำไมเป็นเช่นนั้น?

                        val isHighResult = e!!.y >= 3.5
                        val isMediumResult = e.y > 1.5 && e.y < 3.5
                        val isLowResult = e.y <= 1.5

person space.trueper    schedule 18.06.2021    source แหล่งที่มา
comment
ฉันถือว่าตัวแปร e ไม่เปลี่ยนแปลงเนื่องจากคุณใช้การยืนยันค่าว่าง ดังนั้นหากมันใช้งานได้ในการเรียกครั้งแรก มันควรจะใช้ได้กับการโทรหลังจากนั้น หากคุณย้ายหนึ่งบรรทัดไปที่ด้านบนของการยืนยันค่าว่าง มันจะแจ้งเตือนคุณ   -  person abdullah yousry    schedule 18.06.2021


คำตอบ (1)


พารามิเตอร์ของฟังก์ชันมีค่าคงที่ รหัสบรรทัดแรกของคุณรับประกันได้ว่า e ไม่เป็นค่าว่าง หรือโค้ดบรรทัดถัดไปจะไม่สามารถเข้าถึงได้ เนื่องจากจะส่ง KotlinNullPointerException หาก e เป็นค่าว่าง ดังนั้นตามตรรกะแล้ว จึงเป็นไปไม่ได้ที่ e จะเป็นโมฆะหากถึงบรรทัดที่สองของโค้ด และคอมไพลเลอร์สามารถส่งไปยังรายการที่ไม่เป็นโมฆะได้อย่างชาญฉลาด

นี่ไม่ใช่กรณีที่เกิดขึ้นไม่บ่อยนักที่อาจจะใช้ !! ได้ ไม่มีเหตุผลใดที่โค้ดภายในฟังก์ชันนี้ควรคาดหวังให้ e ไม่เป็นค่าว่าง หากคุณประกาศว่าเป็นพารามิเตอร์ฟังก์ชันที่เป็นค่าว่าง ด้วยการประกาศว่าเป็นโมฆะ ฟังก์ชันของคุณกำลังประกาศ (สำหรับโปรแกรมเมอร์ที่ใช้งานมัน) ว่าสามารถส่งค่า null เป็นพารามิเตอร์ได้อย่างปลอดภัย

person Tenfour04    schedule 18.06.2021
comment
ฉันใช้ตัวแปรเหล่านี้ภายในคำสั่ง if ซึ่งการตรวจสอบจะเป็นโมฆะหรือไม่ รหัสค่อนข้างซับซ้อน ดังนั้นฉันจึงไม่สามารถดำเนินการกับ ?: ได้ Ty สำหรับคำตอบที่ครอบคลุม! - person space.trueper; 18.06.2021
comment
ภายในคำสั่ง if (e != null) นั้น e จะเป็น smart-cast ไม่เป็นโมฆะ ดังนั้นคุณไม่จำเป็นต้องใช้ !! นอกจากนี้ หากคุณกลับมาจากฟังก์ชันภายในคำสั่ง if (e != null) ดังนั้น e จะกลายเป็น smart-cast ไม่เป็นโมฆะหลังคำสั่ง if - person Tenfour04; 18.06.2021
comment
มันซับซ้อนกว่านี้เล็กน้อย ฉันใช้มันใน if (e?.x == x.toFloat()) ซึ่งในทางกลับกันก็อยู่ภายใน for (x in 0..9) - person space.trueper; 18.06.2021
comment
อ๋อ เข้าใจแล้ว ถ้าอย่างนั้นการใช้ !! ภายในคำสั่ง if นั้นก็จะปลอดภัยกว่า เงื่อนไขนี้ซับซ้อนเกินกว่าที่คอมไพลเลอร์จะสามารถใช้เพื่อสมาร์ทคาสต์ได้ นั่นเป็นเงื่อนไขที่แปลกแม้ว่า โดยพื้นฐานแล้ว หาก e หรือ x เป็นโมฆะ ก็จะเกิดข้อยกเว้นขึ้น ฉันไม่เห็นรหัสทั้งหมดของคุณ แต่ก็ยังดูไม่ปลอดภัย - person Tenfour04; 18.06.2021
comment
โอ้ คุณ! ฉันคิดว่ามันจะไม่ทำงาน :) - person space.trueper; 18.06.2021
comment
เอ่อ..ผมอ่านผิดครับ.. ดูเหมือนว่า x จะไม่เหมือนกับ e.x แต่ถ้า x เป็นสตริง toFloat() จะล้มเหลวหากไม่สามารถแยกวิเคราะห์เป็นโฟลตได้ - person Tenfour04; 18.06.2021
comment
ไม่ x มาจาก for loop คุณพูดถูก :) - person space.trueper; 18.06.2021