LoginSignup
5
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-09

はじめに

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が発生するので非推奨です。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3