【 Kotlin 】nullの扱い方について


はじめに

Android Studioの補完機能のおかげでnullの扱いについて曖昧な理解になってしまっていたので、理解している範囲でまとめました。

null安全とは

Kotlinは、JetBrain社がJavaに代わり、より簡潔に書くことを目的として作られたJVM(Java仮想マシン)上で動作する静的型付き言語です。
静的型付き言語はコンパイル時に型チェックが行われるため、実行時に型が原因でのエラーは起きないという特徴を持ちます。JavaやKotlinもこれにあたり、「型安全」な言語とも言います。

同様に、「null安全」な言語はコンパイル時に変数がnull許容型(Nullable)かnull非許容型(Non-Null)かチェックされるため、実行時にnullによるエラーは起きません(基本的にnull非許容型が原則)。
Kotlinはこの性質を持ちますが、Javaにはありません。

null非許容型(Non-Null)の特徴

宣言と代入

var a : String = "hello!!"
a = "apple" // ok
a = null // Error

String型の変数aを変更可能なように宣言したとします。
appleを代入することは可能ですが、原則nullの代入は許されないのでコンパイル時にエラーが起きます。

参照

var a : String = "hello!!"
println(a.length) // ok

null許容型のメソッドやプロパティを参照する際はエラーなし。

null許容型(Nullable)の特徴

宣言と代入

var b : String? = "hello!!"
b = null // ok

変数bをnull許容型として宣言したい場合、型の後ろに?を付けるとnullの代入が可能になります。

参照

var b : String? = "hello!!"
println(b.length) // Error

null許容型のメソッドやプロパティを参照するとコンパイルエラーが起きます。
null許容型はこのままでは参照することができないので、null許容型からnull非許容型に変えてあげる必要があります。

null許容型からnull非許容型へ

①nullチェック

var b : String? = "hello!!"
if( b != null ){
println(b.length)
} // 7

bがnullでなければ参照可能

②スマートキャスト

var b : String? = "hello!!"
if( b is String ){
println(b.length)
} // 7

String?型からString型に型変換することで参照可能に

③安全呼び出し

var b : String? = "hello!!"
println(b?.length) // 7

var b : String? = null
println(b?.length) // null

変数の後に?を付けることでnullでない場合は参照しnullであればnullが返ります。

④エルビス演算子

var b : String? = "hello!!"
println(b?.length ?: 0) // 7

var b : String? = null
println(b?.length ?: 0) // 0

?:演算子をエルビス演算子といい、nullであれば演算子の右側を返し、nullでなければ演算子の左側を返します。(※bの後に安全呼び出しがないとエラーが起きます。)

⑤!!演算子(※)

var b : String? = "hello!!"
println(b!!.length) // 7

null許容型をnull非許容型に無理やり変更する演算子ですが、bがnullであった場合NullPointerExceptionが発生するので非推奨です。