變數延遲初始化 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...