android系統上崩潰率最高的異常型別就是空指標異常。
我們需要知道的是:空指標是一種不受程式語言檢查的執行時異常,只能有程式設計師主動通過邏輯判斷來避免。
舉個例子,對於一段簡單的呼叫引數的j**a**,我們要使**安全性更高,更穩妥的做法就是再呼叫引數的方法之前先進行乙個判空處理。如下:
public void dostudy(study study)相較於j**a,kotlin非常科學的解決了這個問題,它利用編譯時判空檢查的機制基弧杜絕了空指標異常。雖然編譯時判空機制有時候導致**更難書寫,但kotlin提供的多種輔助工具可以很好的處理各種判空情況
在類名的後面加上乙個問號,例如int表示不可為空的整形,而int?就表示可為空的整形。
?.操作符
對於上面的dostudy()函式,如果我們希望傳入的引數可以為空,那麼就可以如下進行實現:
fun main()?:操作符fun dostudy(study:study?)
這個操作符左右兩邊都接收了乙個表示式,當左邊表示式的結果不為空則返回左邊表示式的結果,否則就返回右邊表示式的結果
舉例如下:
var m:string?="hello"!!.操作符var m2:string?=null
fun main()
/*上面這段**中的 var c1=m2?:m 等價於如下**:
val c=if(m2!=null)
else
*/
當我們在main( )函式裡先進行一次判空操作,裡面呼叫乙個函式。此時我們是無法通過編譯的,因為呼叫的函式並不知道外部已經進行了非空檢查,在呼叫函式時依舊認為這裡面存在空指標風險,從而無法編譯通過
這種情況下,我們想要強行通過編譯,就可以使用非空斷言工具,寫法是在物件的後面加上!!,如下所示:
var m:string?="hello"需要注意的是這是一種有風險的寫法,意在告訴kotlin,我非常確信這裡的物件不會為空,所以不需要繼續執行空指標檢查;如果出現問題kotlin可以直接丟擲異常,後果由我自己承擔。fun main()}
fun printuppercase()
Kotlin新手入坑 空指標檢查 ST
變數延遲初始化 lateinit 抓住今天,盡可能少的信賴明天。喝湯能補 如果進行過android專案開發者,經常會遇到空指標的問題,雖然解決方法不難,但是這個問題經常會導致程式崩潰,對應的到生活中口袋就瘦了。kotlin預設所有的引數和變數都是不可為空的。當然也提供了一套可空的型別系統。上 fun...
空指標異常的問題
空指標異常 這個異常屬於 runtimeexception 的子類,所以編譯的時候感覺沒啥問題,一執行崩潰了。為啥會出現這個異常,下面是我的個人理解。原因 當乙個物件不存在 即物件 null 時,呼叫方法或者變數會出現空指標異常。具體原因是,當物件為null時,堆記憶體存放物件屬性為空,而使用方法時...
討論啟發靈感 重繪中的空指標異常問題
idea 今天做了簡單畫圖板,要重繪乙個物件類的陣列,出現了乙個空指標問題 還沒對物件類的陣列進行例項化,就重繪啦,而重繪中有用到那個陣列,因而出現了空指標異常。在同學的啟發下,我覺得在重繪方法中,使用陣列前先對陣列進行初始化,關鍵來啦,初始化時,對其引數進行設定,比如type 1 我們不使用的型別...