
みなさまこんにちは〜!
メモリアインクのすだです。
今回は、Kotlinでの開発における「null安全」の考え方と、「null許容型」と呼ばれる変数の定義について、実際のコードを使いながら解説していきます。
この記事を読んでわかること…
・null安全とは?
・null許容型の使い方
環境
- Kotlin (ver 1.9.0)
- Android Studio (Giraffe | 2022.3.1 Patch 3)
null安全とは?
null安全(null-safety) とは、プログラムが「nullによるエラー」を起こさないようにする仕組みのことです。
たとえば、こんな Kotlinで以下のコードを書くとします:
val name: String = null // エラー
Kotlin では、nullを許さない型(非null型) に null
を入れると コンパイルエラー になります。
これは nullによるアプリクラッシュ(NullPointerException)を防ぐための仕組みです。
null許容型とは?
Kotlinではできるだけnullを避けるのが基本ですが、実際のアプリ開発ではnullを許容しなければいけない場面が意外とあります。
たとえば以下のようなパターン:
- 「未設定」や「未入力」を表す目的
- ユーザーがニックネームをまだ登録していない場合があり、デフォルトでは
null
にしておいて、登録されたら値を入れる
- ユーザーがニックネームをまだ登録していない場合があり、デフォルトでは
- 外部データの受け皿としての目的
- APIレスポンスの値がnullの可能性があるとき
- 「見つからなかった」ことを安全に表現する目的
- 検索の結果が見つからないとき
こういった場合にnullを使うのは便利なので、nullを許容する変数に変更する必要があります。
これが「null許容型」と呼ばれるものです。
Kotlinでは、?
を型名につけることで null を許容することができます。
val name: String = null // エラー(null不可)
↓
val name: String? = null // OK(nullを許容)
null安全のための演算子
Kotlinには、?
以外にもnullの値を扱うための演算子がいくつかあり、シーンによって使い分ける必要があるので
ここで全て紹介します。
?.
(セーフコール演算子)
?.
は 「nullでなければ処理、nullならそのままnullを返す」 という安全な呼び出し方法です。
name が null だった場合、length には null が入ります(クラッシュしない)
val name: String? = "Hanako"
val length = name?.length // nullならそのままnullを返す
セーフコール演算子をつけずにval length = name.length
と書くとコンパイルエラーになるので注意。
?:
(エルビス演算子)
?:
は 「nullだったらこの値を代わりに使ってね」という演算子です。
つまりは、nullだった場合のデフォルト値を設定できます。
val name: String? = null
val result = name ?: "Unknown"
let
+ ?.
(スコープ関数を活用)
?.let { ... }
は、変数がnullでなければ、その中で処理を行うという安全な書き方。
nullチェックと処理を1つにまとめたいときに便利です。
val comment: String? = null
comment?.let {
println("長さ: ${it.length}")
} ?: println("コメントがありません")
!!
(非null断言演算子)※非推奨
!!
は 「絶対に null じゃない!」 と Kotlin に伝える演算子です。
String? は本来 null かもしれないので、Kotlin は .length を直接使わせてくれません。
そこで !!
をつけると「OK、自己責任で使います」となります。
val name: String? = "Taro"
val length = name!!.length
name
が null
だった場合、クラッシュ(NullPointerException)しますので非推奨です。
基本的には使わない方向で実装しましょう。
まとめ
おつかれさまでした。いかがでしたでしょうか!
null許容型の値を使って処理を書く場合は、?.let {}
や ?:
を使ってnullに備えた処理を書くことが大切です。
そもそも「nullを使わなくて済む設計」も大事(非null型の活用)ですので、よく考えて使ってください。



技術者としてのキャリアパスを次のレベルへと進めたい皆様、
<未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】>
自分の市場価値をさらに向上させてみませんか?
それではまた次回の記事でお会いしましょう!
コメント