BackEnd

Kotlinでのnullの基本的な扱いかた

投稿日:

はじめに

こんにちは。今回は改めてKotlinでのnullの扱いについての基本をまとめます。
曖昧な理解のままAndroidStudioの補完に頼りきりでしたので、基本的な書き方を網羅することで、Kotlinでどのようなコードを書けばよいのかという指針になればと思います。

なお、コードを試す際はブラウザからKotlinの動作を確認できるTry Kotlinを使用します。

基本的にnullを許容しない

Javaは全ての型にnullが代入される可能性があります。そのためコードのあちこちで
if (object != null) {...} というnullチェックを書く必要がありましたが、Kotlinでは変数にnullが入らないこと(non-null)を基本としています。
nullが入り込まないことが前提であれば、NPE(NullPointerException)は起こり得ません。

装飾なしの型宣言ではnullを代入できず、コンパイルエラーとなります。

nullを許容するNullable

型名に「?」をつけることでnullを入れられる(Nullable、null許容)ようになりますが、Nullableのままメソッドやプロパティを呼び出そうとするとコンパイルエラーになります。
Javaであれば、実行時にNullPointerExceptionとなることで初めてコードの間違いに気づけますが、Kotlinではコンパイルの時点で指摘してくれます。

また、non-nullの変数にNullableを代入することもできません。 StringString? は異なる型として扱われるためです。
下記のコードの場合はたまたま message1 に文字列が入っていますが、nullになりうる型のままでは、non-nullである message2 への代入は許されないということですね。

Nullableをnon-nullに変える

いくつかの方法があります。

nullチェックとスマートキャスト

if文でnullが入っていないことを確認できた場合、その変数はifのブロック内でのみnon-nullとして扱えます。
この動作はKotlinのスマートキャスト機能によるものです。

なおスマートキャストはnullチェックだけでなく、変数の型チェック全般で使えるものです。
以下の例では、Any型として初期化されている変数の型チェックを行うことで、Int型として加算処理が可能になっています。

エルビス演算子

変数への代入に ?: を使うことで、この演算子の左式がnullだった場合は右式が評価されます。Javaや他言語の三項演算子のように使える感じですね。

上記コードではJavaのSystem.getProperty()の結果を代入しています。Javaはnull安全性が無いため、Javaライブラリから呼び出した結果は全てNullableとして扱われます。
環境変数user.nameが設定されていないとnullが返ってくるため、その時は ?: の右式が評価され、変数userNameには unknown property. が入ります。

セーフコール演算子

変数のあとに ?. をつけることで「変数がnullでなければメンバーにアクセスし、nullならnullを返すだけ」という意味になります。
変数 message1 および message2 が下記コードでnon-nullに変換されるわけではありませんが、変数の値が間違いなくnullではないと分かっていれば、このような記述が可能です。

!!演算子

変数のあとに !! をつけることで強制的にnon-nullに変換できます。ただし、中身がnullだった場合はメソッドやプロパティへのアクセス時にNullPointerExceptionが発生します。
コンパイルの時点でnullの可能性を潰せておらず、Kotlinのnull安全性を活かせていないため、非推奨な方法です。

さいごに

いかがでしたでしょうか。IDEの指摘に頼りきってとりあえずエラーを回避するのではなく、基本的な文法を学ぶことで、作法に則ったコードを書く意識が強くなり「どのように書くべきか」の指針を得られたと感じています。
とにかく動くコードこそ正義というケースもあるかもしれませんが、言語の機能を活かすため、ひいてはコードの品質を上げるためにも、勉強を続けようと思います。

おすすめ書籍

Kotlinスタートブック -新しいAndroidプログラミング Kotlinイン・アクション 速習 Kotlin: Javaより簡単!新Android開発言語を今すぐマスター 速習シリーズ

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Rust入門してみた その3 Enum / match / Option編

1 はじめに2 Enum2.1 Enumの定義2.2 パターンマッチ2.3 Enumへのメソッド実装3 よく使う標準Enum3.1 Option3.2 Result4 おすすめ書籍 はじめに 前回に引 ...

Vue.js入門その4〜TODOアプリにサーバーサイドを追加してみる〜

1 はじめに2 準備2.1 今回作成したいもの2.2 環境構築3 サーバーサイド3.1 DB3.2 メモ:rails generateで余分なファイルを生成しない3.3 作成したファイル4 ビューの作 ...

laravel logo

Laravelの便利なメールアドレスのバリデーション設定

1 はじめに2 不具合内容2.1 バリデーションルール設定2.2 不正なメールアドレス例3 対応3.1 email:rfc3.2 email:strict3.3 email:dns3.4 email: ...

Laravelのchunkメソッドとcursorメソッドのメモリ使用量

1 はじめに2 テスト用のデータ準備3 get()4 chunk()5 chunkById()6 cursor()7 さいごに8 おすすめ書籍 はじめに テーブルの全レコードに一括で処理を行うバッチを ...

laravel logo

PHPで画像編集~Intervention Image~

1 はじめに2 やる事3 インストール4 画像読み込み5 文字列の追加6 編集した画像の保存7 実際のコード8 他に使う機会がありそうな編集8.1 モザイク8.2 ぼやけ8.3 リサイズ9 さいご10 ...

フォロー

blog-page_side_responsive

2018年11月
 123
45678910
11121314151617
18192021222324
252627282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。