Kotlin新手入坑 空指標檢查 ST

2021-10-10 21:40:20 字數 1768 閱讀 2723

變數延遲初始化 lateinit

抓住今天,盡可能少的信賴明天。喝湯能補 (* ^ ▽ ^ *)

如果進行過android專案開發者,經常會遇到空指標的問題,雖然解決方法不難,但是這個問題經常會導致程式崩潰,對應的到生活中口袋就瘦了。

kotlin預設所有的引數和變數都是不可為空的。當然也提供了一套可空的型別系統。

上**

fun main() 

fun usefun(an: animal)

fun usefun1(an: animal?)

}

kotlin提供了一系列的輔助工具,幫助我們輕鬆處理各種判空情況。

if(an!=null)

// 可以簡寫為

an?.eat()

an?.say()

val c = if (a != null)else

// 將上面**直接使用?:進行簡寫

val c = a ?: b

專案中,可以簡化怎樣的**

fun gettextlength(text : string?) :int

return 0

}// 可以通過 ?. 與 ?: 進行簡化

fun gettextlength0(text: string?) = text?.length ?: 0

kotlin的空指標檢查機制 ,不一定能判斷出我們程式所有的非空情況。

如下**中,邏輯上沒有問題,但kotlin卻無法正常編譯過,因為gestrlength()函式不知道外部已經進行了為空判斷,所以認為str.length的str可能為空。

這種方式並不推薦,使用不當就會引發程式問題

val str : string? = "aaa"

fun main()

}fun gestrlength()

let函式,將原始呼叫物件作為引數傳遞到lambda表示式中。

val obj=""

obj.let

將obj物件傳遞到lambda表示式中,引數名為obj2,但obj與obj2 是同乙個物件。

使用let與?.更加簡化為空判斷

fun usefun1(an: animal?)

// 優化

fun usefun2(an: animal?)

}// 上篇說的,只有乙個引數,可以使用it

an?.let

// 無法編譯通過

var animal :animal? = null

fun usefun3(an: animal?)

}

**其他標準函式的使用,見常見標準函式 **

在程式中,定義全域性變數時,往往會後初始化值,這時就需要將變數初始化為null,而因kotlin的空指標檢查機制,需要對明確知道不可能為空的物件,進行判空處理。所以,提供了延遲初始化的方式對這種問題進行優化。

延遲初始化:延遲初始化的關鍵字lateinit ,其作用就是告訴編譯器,會在晚些時候對這個變數進行初始化,因此就無需在宣告該變數時,就將它賦值為null。

private lateinit var file: file // 延遲對file類進行初始化

fun main()

}

kotlin中的空指標檢查問題

android系統上崩潰率最高的異常型別就是空指標異常。我們需要知道的是 空指標是一種不受程式語言檢查的執行時異常,只能有程式設計師主動通過邏輯判斷來避免。舉個例子,對於一段簡單的呼叫引數的j a 我們要使 安全性更高,更穩妥的做法就是再呼叫引數的方法之前先進行乙個判空處理。如下 public vo...

Kotlin空指標安全

1.可為null型別 在kotlin中通常我們直接定義的型別是不可以為null的,如下 fun main 如果想要允許為null,我們需要在變數的型別後面加上乙個?號。如下 fun main args array 這樣就不會編譯報錯了 2.安全呼叫 上面的例子中,如果呼叫s.length的話,這將是...

CTF新手入坑指南

web方面推薦 諮詢vul ghost 推薦逆向 web至少乙個,準備打ctf的話,雜項和密碼學雖然也行,但實際上這個後期並不是很好單走的,輔助型比較多 當然入門級比賽這兩個還是蠻爽的 逆向初步,知道指令 堆 棧還有od ida簡單使用 王爽的x86組合語言是不錯的 c 黑客程式設計也是不錯的 od...