##はじめに
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が発生するので非推奨です。