WebHU - Programozási kérdések és válaszok

Kotlin null ellenőrzi(!!), ha a nullabilitás már be van ellenőrizve

Lenne egy kérdésem a Kotlinnal és a null ellenőrzési figyelmeztetéseivel kapcsolatban.

Tegyük fel, hogy létrehoztam egy "user" nevű objektumot valamilyen attribútummal, például névvel, vezetéknévvel stb. A következő kód egy példa:

if(user != null) {
    val name = user!!.name
    val surname = user.surname
    val phoneNumber = user.phoneNumber
} else 
    // Something else

Miért, még ha ellenőriztem is, hogy a felhasználó nem null, Kotlin azt akarja, hogy használjam !! amikor először hívom a felhasználót? Ezen a ponton nem lehet nulla.

Tudom, hogy használhatom a következő blokkot, de nem értem ezt a viselkedést.

user?.let{
    // Block when user is not null
}?:run{
    // Block when user is null
}
09.07.2019

  • Ez csak figyelmeztetés, mert a fordító nem fogja kiértékelni a teljes kódrészletet. Csak kiértékeli a sort a változó deklarációjával. 09.07.2019
  • Amikor futtatom a fenti kódot, a második sorban egy szükségtelen, nem nulla állításra vonatkozó figyelmeztetést kapok. Ennek szintén nincs értelme: vagy mindig ellenőrizni kell a semmisséget (tehát a vezetéknévhez is !! kell), vagy csak egyszer (a if-nál). Kérjük, ellenőrizze, hogy a megadott kód helyes-e. 09.07.2019
  • Hogyan van deklarálva a user mező? Amikor kipróbálom ezt a kódrészletet, nem nulla castot kell csinálnom minden egyes sorban, ha a fordító csak 1 casttal enged, az furcsa. 09.07.2019

Válaszok:


1

Ennek a viselkedésnek oka van. Alapvetően azért, mert a fordító nem tudja biztosítani, hogy a user értéke ne legyen nulla a if ellenőrzése után.

Ez a viselkedés csak a var user esetében alkalmazható, a val user esetében nem. Tehát pl.

val user: User? = null;
if (user != null) {
  // user not null
  val name = user.name // won't show any errors
}
var user: User? = null;
if (user != null) {
  // user might be null
  // Since the value can be changed at any point inside the if block (or from another thread).
  val name = user.name // will show an error
}

A let lehetővé teszi a változatlanság biztosítását még var változók esetén is. A let új végső értéket hoz létre az eredeti változótól elkülönítve.

var user: User? = null
user?.let {
  //it == final non null user
  //If you try to access 'user' directly here, it will show error message,
  //since only 'it' is assured to be non null, 'user' is still volatile.
  val name = it.name // won't show any errors
  val surname = user.surname // will show an error
}
09.07.2019
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..