老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

詳解Kotlin的空指針處理

詳解Kotlin的空指針處理

創(chuàng)新互聯(lián)來電聯(lián)系:18980820575,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務,創(chuàng)新互聯(lián)網(wǎng)頁制作領(lǐng)域10年,包括成都假山制作等多個領(lǐng)域擁有多年的網(wǎng)站運維經(jīng)驗,選擇創(chuàng)新互聯(lián),為企業(yè)保駕護航!

Kotlin的空指針處理相比于java有著極大的提高,可以說是不用擔心出現(xiàn)NullPointerException的錯誤,kotlin對于對象為null的情況有嚴格的界定,編碼的階段就需要用代碼表明引用是否可以為null,為null的情況需要強制性的判斷處理。

咋看一下這些在java里面其實也有,問題是一般開發(fā)中不寫也是可以的(大部分開發(fā)不會花很多時間考慮這些),等出了空指針錯誤再一個個打補丁。這樣往往會遺漏很多空指針,后期的解決僅僅是做一個if判斷,沒有從根源解決問題

變量需要知道是否可以為null

第一個與java的不同,kotlin聲明引用時不可以直接賦值為null

var helloA: String=null //編譯器直接報錯 null can not be value of a non null type string

這里插一句,kotlin的成員變量(全局變量)必須要初始化甚至是基本數(shù)據(jù)類型都要手動給一個初始值,局部變量可以不用初始化,上面的例子是成員變量的聲明。

編譯器直接表示hello是一個non null type你不可以直接賦一個null值。對于我們java原住民來說聲明變量時如果不去賦值,編譯器會默認賦null(除去基本數(shù)據(jù)類型),在kotlin這是不允許的。

類型?

當某個變量的值可以為 null 的時候,必須在聲明處的類型后添加 ? 來標識該引用可為空。

這是官方文檔的說明,也就是說上面的變量聲明只需要在String類型后面加一個?就可以解決這個錯誤。

var helloB : String? = null

如果不用?也可以直接初始化來解決問題

var helloA : String = "hello"

String和String?

helloA 和 helloB2個變量的類型分別為String和String?,這2種類型的區(qū)別在于引用時是否空安全,String?代表可能為空,引用不安全,String代表不會為空,引用安全。比如調(diào)用一下helloB的方法

詳解Kotlin的空指針處理

可以看到有些方法是灰的代表不能直接調(diào)用,有些是白的代表可以直接調(diào)用,為什么可以直接調(diào)用后面再講

helloB.length //Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
這里的錯誤解釋簡單的理解就是helloB是一個可能為空的類型(String?),對于可空類型你必須做判空的處理才能調(diào)用方法。有沒有愛上kotlin? wtf太厲害了

如何做判空處理

最簡單的方法就是使用?.來調(diào)用方法。這個符號的意義是,當helloB不為空調(diào)用.length方法,返回Int值,如果helloB為空則返回null。

helloB?.length

注意這里的返回值類型為Int? 依然是可以為空的類型

不推薦的寫法!!這個操作符可以說是為了空指針錯誤愛好者準備的,使用了!!操作符代表你不關(guān)心變量的空判斷可以報出NullPointerException,又或者你有絕對的自信這里肯定不為空,可以放心的調(diào)用,可以說!!放棄了判空的檢查

helloB!!.length

Elvis 操作符?:

回到?.的調(diào)用上來,這個調(diào)用方式存在一個讓人不安的處理,就是在變量為null的情況下,會直接返回null,這樣空指針的隱患還在。

var l : Int = helloB?.length //報錯類型不匹配 Int? 和 Int

修正的話需要通過if判斷來進行判空處理

var l: Int = if (helloB?.length != null) helloB.length else -1

這種寫法可以簡化成Elvis 操作符?:

var le: Int = helloB?.length ?: 0

當?:左邊非空返回左邊的值,左邊為空則返回右邊的值

最后前文提到的當helloB為空時有些方法仍然可以調(diào)用比如equals方法

helloB.equals(helloA)

即使helloB為可空類型依然可以調(diào)用equals方法,但是這里的equals方法并不是String.java的equals方法,而是StringJvm.kt中的equals方法

public fun String?.equals(other: String?, ignoreCase: Boolean = false): Boolean {
  if (this === null)
    return other === null
  return if (!ignoreCase)
    (this as java.lang.String).equals(other)
  else
    (this as java.lang.String).equalsIgnoreCase(other)
}

關(guān)鍵代碼

this===null
return other === null

這個方法對變量本身為null的情況已經(jīng)做了判斷,同時方法寫成了String?.equals可以讓String?類型的對象直接調(diào)用這個equals方法

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


網(wǎng)站欄目:詳解Kotlin的空指針處理
當前鏈接:http://www.xueling.net.cn/article/ggiohh.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 狠狠躁天天躁日日躁欧美 | 国产69久久精品成人看动漫 | 无码骚夜夜精品 | 国产AV无码专区亚洲AV毛片搜 | 看色网站 | 国产无线卡一卡二 | 亚欧视频在线观看 | 精品久久国产老人久久综合 | 中文字幕在线播放第一页 | 被多个强壮的黑人灌满精 | 西川av在线一区二区三区 | 毛片在线免费视频 | 99视频在线精品 | 国产一级特黄真人毛片 | 亚洲欧美色αv在线影视 | 久久精彩| 国产片一区二区 | 69国产成人免费精品视频 | 久久黄色一级视频 | 久久久不卡网国产精品一区 | 国产黄色麻豆视频 | 国产精品白丝久久av网站 | 亚洲欧洲av一区二区久久 | 亚洲性夜夜时 | 欧美久久深夜AAA片 自拍视频在线播放 | 人人藻人人澡人人爽 | 91看剧 | 国产a视频精品免费观看 | 偷拍区另类综合在线 | 激情信封 | 狼群社区视频www中文 | 日韩女优一区二区三区 | 午夜刺激爽爽视频免费观看 | 91免费看| 国产精品丝袜久久久久久消防器材 | 99久久无色码中文字幕 | 欧美精品久久久久久久久久久 | 拍摄AV现场失控高潮数次 | 国产亚洲精品成人AA片在线播 | 人人爽人妻精品A片二区 | 狠狠综合久久久久综合网 |