欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin 中安全地處理可空類型的方式

 更新時間:2025年05月26日 09:53:26   作者:橙子19911016  
在 Kotlin 中,可空類型(如String?)是語言設(shè)計的核心特性之一,旨在從編譯時避免 NullPointerException(NPE),這篇文章主要介紹了Kotlin 中該如何安全地處理可空類型,需要的朋友可以參考下

在 Kotlin 中,可空類型(如 String?)是語言設(shè)計的核心特性之一,旨在從編譯時避免 NullPointerException(NPE)。

1 核心處理方式

1.1 安全調(diào)用操作符(?.)

直接調(diào)用可空對象的方法或?qū)傩?,若對象?null,則返回 null,而非拋出異常:

val str: String? = null
val length: Int? = str?.length // str 為 null 時,length 直接為 null

鏈?zhǔn)秸{(diào)用:

// 傳統(tǒng)方式(可能 NPE)
val result = obj.property.method()
// 安全方式
val result = obj?.propery?.method() // 任意環(huán)節(jié)為 null 時,直接返回 null

1.2 Elvis 操作符(?:)

當(dāng)可空值為 null 時,提供默認(rèn)值或處理邏輯。

val str: String? = null
val length: Int = str?.length ?: 0  // str 為 null 時,返回 0
// 安全調(diào)用 + Elvis 結(jié)合使用
 val name: String = user?.name ?: "Unknown" // 若 user 或 name 為 null,使用默認(rèn)值

1.3 非空斷言操作符(!!.)

明確告訴編譯器“該值不可能為 null”,若值為 null 則拋出 NPE(需謹(jǐn)慎使用)。

val str: String? = "Hello"
val length: Int = str!!.length

適用場景:

初始化階段已確保值不為空,但編譯器無法推斷;

單元測試總驗證代碼邏輯的正確性;

1.4 let 作用域函數(shù)

對非空值執(zhí)行操作,空值則跳過。

val str: String? = "Hello"
str?.let { nonNullStr ->
    // 僅在 str 非空時執(zhí)行,nonNullStr 為非空類型 String
    println(nonNullStr.uppercase())
}

1.5 also 或 apply 函數(shù)

對可空對象進(jìn)行鏈?zhǔn)讲僮鳌?/strong>

val user = nullableUser?.apply {
    age += 1 // 若 nullableUser 非空,執(zhí)行 age 自增
}

1.6 空檢查(if(x != null))

手動檢查空值,編譯器會只能轉(zhuǎn)換類型。

val str: String? = "Hello"
if (str != null) {
    // str 在此作用域內(nèi)自動轉(zhuǎn)換為非空類型 String
    println(str.length) // 無需安全調(diào)用
}

1.7 延遲初始化(lateinit)

用于標(biāo)記非空但稍后初始化的變量(僅限 var)。

lateinit var user User // 必須確保初始化后再使用
fun initUser() {
    user = User("Eileen")
}

1.8 類型檢查與智能轉(zhuǎn)換

通過 is 檢查類型后,編譯器自動智能轉(zhuǎn)換。

if (value is String) {
    println(value.length) // value 自動轉(zhuǎn)為 String 類型
}

1.9 安全類型轉(zhuǎn)換(as?)

轉(zhuǎn)換失敗時返回 null,而非拋出 ClassCastException

val obj: Any = "Hello"
val str: String? = obj as? String // 轉(zhuǎn)換成功,str 為 "Hello"
val num: Int? = obj as? Int // 轉(zhuǎn)換失敗, num 為 null

2.0 集合的可空處理

使用 filterNotNull()mapNotNull() 過濾或轉(zhuǎn)換可空集合。

val list: List<String?> = listOf("a", null, "b")
val nonNullList = list.filterNotNull() // [a, b]
val lengths = list.mapNotNull { it?.length } // [1, 1]

2.1 可空類型的擴(kuò)展函數(shù)

自定義處理邏輯,例如為 String? 提供空值處理。

fun String?.orEmtpy(): String = this ?: ""
val safeText: String = nullableText.orEmpty() // 若為 null,轉(zhuǎn)為空字符串

2 總結(jié)

  • 優(yōu)先使用安全調(diào)用(?.)和 Elvis(?.):簡潔高效,避免 NPE;
  • 謹(jǐn)慎使用非空斷言(!!):僅在確定值非空時使用,否則會破壞 Kotlin 的空安全設(shè)計;
  • 使用 let 作用域函數(shù)處理非空邏輯:避免空值分支的冗余代碼;

到此這篇關(guān)于Kotlin 中該如何安全地處理可空類型的文章就介紹到這了,更多相關(guān)Kotlin 可空類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java連接Oracle數(shù)據(jù)庫實例解析

    Java連接Oracle數(shù)據(jù)庫實例解析

    數(shù)據(jù)庫的操作是當(dāng)前系統(tǒng)開發(fā)必不可少的開發(fā)部分之一。接下來通過本文給大家介紹Java連接Oracle數(shù)據(jù)庫實例解析,非常不錯具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧
    2016-06-06
  • Jenkin郵件收發(fā)實現(xiàn)原理及過程詳解

    Jenkin郵件收發(fā)實現(xiàn)原理及過程詳解

    這篇文章主要介紹了Jenkin郵件收發(fā)實現(xiàn)原理及過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • response.setContentType()參數(shù)以及作用詳解

    response.setContentType()參數(shù)以及作用詳解

    這篇文章主要介紹了response.setContentType()參數(shù)以及作用詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • IntelliJ IDEA 構(gòu)建maven多模塊工程項目(詳細(xì)多圖)

    IntelliJ IDEA 構(gòu)建maven多模塊工程項目(詳細(xì)多圖)

    這篇文章主要介紹了IntelliJ IDEA 構(gòu)建maven多模塊工程項目(詳細(xì)多圖),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 在Java編程中使用正則表達(dá)式

    在Java編程中使用正則表達(dá)式

    這篇文章主要介紹了在Java編程中使用正則表達(dá)式,注意使用matches()方法檢測一下Java對正則表達(dá)式的支持情況,需要的朋友可以參考下
    2015-08-08
  • spring boot教程之全局處理異常封裝

    spring boot教程之全局處理異常封裝

    這篇文章主要給大家介紹了關(guān)于spring boot教程之全局處理異常封裝的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java快速排序及求數(shù)組中第k小的值解析

    Java快速排序及求數(shù)組中第k小的值解析

    這篇文章主要介紹了Java快速排序及求數(shù)組中第k小的值解析,選一個中間值,把數(shù)組中比它小的元素放到左邊,比它大的元素放到右邊,這時形成三個子數(shù)組,分別是中間值,比它大的數(shù)和比它小的數(shù),然后對前后兩個數(shù)組進(jìn)行遞歸,需要的朋友可以參考下
    2023-11-11
  • 關(guān)于Spring的@Autowired依賴注入常見錯誤的總結(jié)

    關(guān)于Spring的@Autowired依賴注入常見錯誤的總結(jié)

    有時我們會使用@Autowired自動注入,同時也存在注入到集合、數(shù)組等復(fù)雜類型的場景。這都是方便寫 bug 的場景,本篇文章帶你了解Spring @Autowired依賴注入的坑
    2021-09-09
  • Spring向頁面?zhèn)髦岛徒邮茼撁鎮(zhèn)鬟^來的參數(shù)詳解

    Spring向頁面?zhèn)髦岛徒邮茼撁鎮(zhèn)鬟^來的參數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于Spring向頁面?zhèn)髦岛徒邮茼撁鎮(zhèn)鬟^來的參數(shù)的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • Java中Map的排序問題詳解

    Java中Map的排序問題詳解

    本文給大家分享的是java中的map的按值排序和按鍵排序問題,并通過具體的示例,希望對大家能有所幫助。
    2016-01-01

最新評論