Kotlinのnull安全演算子の使い方を解説!初心者でもわかる?.と?:の条件式テクニック
生徒
「Kotlinって、nullを扱うのが得意って聞いたんですけど、どうやってうまく処理するんですか?」
先生
「いい質問ですね。Kotlinには?.と?:というnull安全演算子があって、nullのときでもエラーを出さずに処理できる工夫があるんですよ。」
生徒
「へえ、そんな記号があるんですね。どう使えばいいんですか?」
先生
「それでは、Kotlinでnullを安全に扱うための演算子?.と?:について、順番にやさしく解説していきましょう。」
1. null(ヌル)とは?
プログラミングでは「値が入っていない状態」をnull(ヌル)と呼びます。
Kotlinでは、?(クエスチョンマーク)を使うことで、その変数がnullになる可能性があると明示できます。
val name: String? = null
このようにString?と書くと、「この変数には文字列かnullが入るかもしれないよ」とKotlinに伝えていることになります。
2. ?.(セーフコール演算子)の使い方
?.は、nullかもしれない値に対して安全にアクセスするための演算子です。
例えば、名前の長さ(文字数)を取りたいとき、普通に書くとエラーになります:
val name: String? = null
val length = name.length // ← エラー(nullにはlengthがない)
しかし?.を使えば、nullだった場合にエラーを出さずにnullを返してくれます。
val name: String? = null
val length = name?.length
println(length)
null
このように、安全にアクセスするための?.を使えば、プログラムが途中で止まらなくなります。
3. ?:(エルビス演算子)でデフォルト値を設定
?:は「もし左側がnullだったら右側を使う」という意味のエルビス演算子です。
例えば、名前がnullのときに「ゲスト」と表示したい場合、次のように書けます。
val name: String? = null
val displayName = name ?: "ゲスト"
println(displayName)
ゲスト
このように、nullのときに?:で代わりの値を指定することで、安全に値を使うことができます。
4. ?.と?:を組み合わせて使う
この2つの演算子は、?.で安全に値を取り出し、?:でnullだったときの代替値を用意することで、さらに使いやすくなります。
val name: String? = null
val length = name?.length ?: 0
println("文字数:$length")
文字数:0
この例では、nameがnullでもlengthが0になって、プログラムが安全に動きます。
5. null安全演算子を使うメリット
今までのように、いちいちif (name != null)と書かなくても、?.と?:を使えば、短くて読みやすいコードになります。
また、プログラムの途中で落ちてしまうようなエラー(NullPointerException)を未然に防ぐことができるため、安全性の高いコードになります。
6. 実際のif文との違いを比べてみよう
これまでは次のように書いていました:
val name: String? = null
val length: Int
if (name != null) {
length = name.length
} else {
length = 0
}
これを?.と?:を使うと、次の1行で書けます:
val length = name?.length ?: 0
とても簡潔で、しかもnullに強いコードになります。