KotlinのNullable(Null許容型)とは、nullの代入を許可するデータ型のことです。Kotlinはデフォルトでnullを許容しない「Non-Null(Null非許容型)」ですが、型名の末尾に ? を付けることでNullableとして定義できます。
ランタイムエラー(NullPointerException)をコンパイル時に防ぐための基本的な使い方と処理方法を解説します。
1. Nullableの定義方法
変数の初期化や関数の引数・戻り値で null を扱いたい場合に ? を付与します。
// Non-Null型(デフォルト。nullは代入不可)
var name: String = "太郎"
// name = null // コンパイルエラー!
// Nullable型(型名の後ろに ? を付ける)
var nickname: String? = "たろう"
nickname = null // OK!
2. Nullableな変数を安全に扱う4つの方法
Nullableな変数は、そのままメソッドやプロパティ(.length など)を呼び出すとコンパイルエラーになります。安全に値を取り出すための代表的なアプローチは以下の通りです。 [1, 3]
1. セーフコール演算子( ?. )
対象オブジェクトが null でない場合のみ処理を実行し、 null の場合は式全体として null を返します。 [1, 3, 6]
val length: Int? = nickname?.length // nicknameがnullなら結果もnullになる
2. エルビス演算子( ?: )
値が null だった場合のデフォルト値を指定したいときに使用します。 [1, 7]
// nicknameがnullなら、右側の "名無し" が代入される
val displayName: String = nickname ?: "名無し"
3. 安全なスコープ関数( ?.let )
値が null でない場合のみ、ブロック内の処理を実行したいときに最もよく使われます。 [8, 9, 10]
nickname?.let { nonNullName ->
// nicknameがnullでない時だけ実行される(nonNullNameはString型)
println("名前は ${nonNullName} です")
}
4. スマートキャスト( if 文によるチェック)
if 文で明示的に null チェックを行うと、コンパイラが自動的にNon-Null型に変換(キャスト)してくれます。
if (nickname != null) {
// このブロック内では nickname は自動的に Non-NullなString型 として扱える
println(nickname.length)
}
3. 注意が必要な構文:非null値アサーション( !! )
Nullable型を強制的にNon-Null型に変換する演算子です。
val length: Int = nickname!!.length // nicknameがnullの場合、NullPointerExceptionが発生
- 注意点: 万が一変数が
nullだった場合、アプリがクラッシュします。開発者が「絶対にnullではない」と100%確信できる場合(テストコード等)を除き、実務での使用は避けるのがベストです。
4. 逆引き:よく使われる基本パターン
実務で頻出する、NullableとNon-Nullを組み合わせたショートカット記法です。
| 実現したいこと | 記述方法の例 |
|---|---|
| nullなら処理を中断(return) | val result = nickname ?: return |
| nullなら例外を投げる | val result = nickname ?: throw IllegalArgumentException("名前がありません") |
| リストからnullを排除する | val nonNullList = listOf("A", null, "B").filterNotNull() |