Setiap kali saya melakukan satu panggilan sebagai pernyataan non-null, Android studio menghapus peringatan dari variabel lain yang sama

Setiap kali saya mencoba membuat beberapa variabel boolean di dalam suatu fungsi, yang memiliki e: Entri? di konstruktornya, Android studio memberi tahu saya bahwa hanya panggilan aman atau panggilan non-null yang diperbolehkan. Jadi, setiap kali saya melakukan satu panggilan sebagai pernyataan non-null, Android studio menghapus peringatan ini dari variabel lain dan kode berfungsi. Kenapa begitu?

                        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 sumber
comment
Saya berasumsi variabel e tidak berubah sejak Anda menggunakan pernyataan nol jadi jika berfungsi pada panggilan pertama, variabel tersebut akan berfungsi untuk panggilan setelahnya jika Anda memindahkan satu baris ke atas pernyataan nol, itu akan memberi Anda peringatan   -  person abdullah yousry    schedule 18.06.2021


Jawaban (1)


Parameter fungsi adalah konstan. Baris kode pertama Anda menjamin bahwa e bukan nol, atau baris kode selanjutnya tidak akan tercapai karena akan memunculkan KotlinNullPointerException jika e bernilai nol. Jadi secara logis, e tidak mungkin menjadi nol jika baris kode kedua tercapai, dan kompiler dapat mentransmisikannya dengan cerdas ke Entri yang tidak dapat dibatalkan.

Ini bukan salah satu kasus yang jarang terjadi dimana penggunaan !! diperbolehkan. Tidak ada alasan kode di dalam fungsi ini mengharapkan e menjadi non-null jika Anda mendeklarasikannya sebagai parameter fungsi yang dapat dibatalkan. Dengan mendeklarasikannya sebagai nullable, fungsi Anda mengumumkan (kepada pemrogram yang menggunakannya) bahwa aman untuk meneruskan null sebagai parameter.

person Tenfour04    schedule 18.06.2021
comment
Saya menggunakan variabel-variabel ini di dalam pernyataan if, yang memeriksa apakah dapat dibatalkan atau tidak. Kode agak rumit, jadi saya tidak bisa melanjutkan?: . Terima kasih atas jawaban komprehensifnya! - person space.trueper; 18.06.2021
comment
Di dalam pernyataan if (e != null), e akan menjadi smart-cast non-nullable sehingga Anda tidak memerlukan !!. Selain itu, jika Anda kembali dari fungsi di dalam pernyataan if (e != null), maka e akan menjadi smart-cast non-nullable setelah pernyataan if. - person Tenfour04; 18.06.2021
comment
ini sedikit lebih rumit. Saya menggunakannya di dalam if (e?.x == x.toFloat()), yang, pada gilirannya, ada di dalam for (x in 0..9) - person space.trueper; 18.06.2021
comment
Ah, begitu. Maka akan aman untuk menggunakan !! di dalam pernyataan if itu. Kondisinya terlalu rumit bagi kompiler untuk dapat menggunakannya untuk smart-cast. Tapi itu adalah persyaratan yang aneh. Pada dasarnya, jika e atau x adalah null, maka akan muncul pengecualian. Saya tidak bisa melihat semua kode Anda, tapi sepertinya masih belum aman. - person Tenfour04; 18.06.2021
comment
oh, kamu! Saya pikir itu tidak akan berhasil :) - person space.trueper; 18.06.2021
comment
Oh tunggu, aku salah membacanya. Sepertinya x tidak sama dengan e.x. Tetapi jika x adalah sebuah String, toFloat() crash jika tidak dapat diurai menjadi Float. - person Tenfour04; 18.06.2021
comment
nah, x dari for loop, kamu benar :) - person space.trueper; 18.06.2021