【Kotlin】レッスン1-04:Null安全性を理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:Null安全性

この記事の練習問題を解くために必要な知識:
メイン関数入力と出力の基本コメントの書き方変数と定数算術演算子Null安全性文字列の連結と埋め込み文字列操作import文

<<前のページ Kotlin記事一覧 次のページ>>

Kotlinの「Null安全性」とは

この章ではKotlinにおける「Null安全性」の意味や使い方を学習します。用語の解説が不要な方はここをクリックして練習問題へ飛びましょう。




プログラミングにおけるエラーの多くは「Null参照」という、存在しないオブジェクトや値を参照しようとすることで発生します。

特に、例外をキャッチできずにプログラムがクラッシュする原因となり、多くの開発者を悩ませてきました。

Kotlinはこの「Null参照問題」に対処するために、Null安全性を強力にサポートしています。

本記事ではKotlinのNull安全性について学び、安全なコードの書き方を紹介します。

Null安全性の基礎

Nullとは「値が存在しない状態」を指します。

Javaなどでは、nullを誤って参照するとNullPointerException(NPE/ぬるぽ)が発生しますが、Kotlinではこれを未然に防ぐ仕組みが用意されています。

Kotlinではnullを許容する変数と許容しない変数を明示的に区別します。

  • val name: String = "Kotlin" → Nullを許容しない(非Nullable)変数
  • val nullableName: String? = null → Nullを許容する(Nullable)変数

このように型の定義時に?を付けることで、Nullableな変数として扱うことができます。(値がNullであってもエラーにならない)

この明示的な区別がエラーの早期発見に役立ちます。

Null安全性を実現するKotlinの基本構文

Kotlinが提供するNull安全性を実現する構文をいくつか紹介します。

1. 安全呼び出し演算子(?

Nullableな変数を使う際、?を利用して安全に値を取得します。

たとえば以下のように文字列の長さ(length)を取得できます。

val nullableValue: String? = null //定数nullableValueを定義し、nullを代入
val length: Int? = nullableValue?.length //定数lengthに定数nullableValueの文字数を代入
// nullableValueがnullの場合、lengthもnullになる

補足:lengthについて
lengthは文字列が持つ文字数を取得するためのプロパティです。詳細はLesson1-7で学習しますが、ここでは「文字列のサイズを取得するもの」と覚えておけば十分です。

val name: String = "tanaka"
val length: Int = name.length
println(length) //6と出力

2. 非Nullアサーション(!!

Nullが含まれないことを確信している場合に使用します。ただし、nullであれば例外が発生します。

val length: Int = nullableValue!!.length ////定数lengthに定数nullableValueの文字数を代入
// nullableValueがnullの場合、例外がスローされる

3. エルビス演算子(?:

Nullの場合にデフォルト値を提供します。

val length: Int = nullableValue?.length ?: 0 //定数lengthに定数nullableValueの文字数を代入
// nullableValueがnullなら0を代入

4. toIntOrNull()の活用

通常のtoInt()は無効な文字列を数値に変換しようとすると例外をスローしますが、toIntOrNull()は変換できない場合にnullを返します。

val number: Int? = "123".toIntOrNull()  // 変数numberに文字列123を整数に変換して代入
val invalid: Int? = "abc".toIntOrNull() // 変数abcは整数に変換できないためnullを代入

このようにして、無効な入力を安全に処理することができます。

Null安全性を使用する場面

KotlinのNull安全性はユーザー入力やデータベースからの値取得など、値が存在しない可能性がある状況で役立ちます。

たとえばユーザーが入力した値が空かどうかを確認する際、isNullOrEmpty()関数を利用することで、安全に状態を判断できます。

val nullableString: String? = ""  定数nullableStringに空の文字列を代入
val isValuePresent = !nullableString.isNullOrEmpty() //定数isValuePresentに、nullableStringが空か判定した結果を代入
// false: 値は空またはnull

またエルビス演算子を利用して、常に有効な値を扱うことも可能です。

 Null安全性のまとめ

KotlinのNull安全性はエラーを未然に防ぎ、安全なコードを書くための重要な機能です。

?!!、エルビス演算子、toIntOrNull()などの構文を活用することで、コードの安全性が向上します。

特にisNullOrEmpty()などの基本プロパティや関数を使いこなすことで、より安全で簡潔なコードが書けます。

これらの機能は今後学ぶ内容ともつながっており、プログラムの理解を深める重要なステップとなります。

null安全性の練習問題:安全に数値を扱うプログラムを作ろう

ユーザーが入力した値を安全に数値として扱うプログラムを作成しましょう。

このプログラムでは、ユーザーが入力した値を数値に変換し、変換が成功すればその値を表示します。

もし数値に変換できない場合は、0として処理を行います。またその結果に1を加えた値も出力しましょう。

この問題を通じて、KotlinのNull安全性を活用したプログラミングを学びます。

この問題の要件

以下の要件に従ってコードを完成させてください。

  1. readLine()を使用して、ユーザーから文字列として入力を受け取ること。
  2. 入力値をtoIntOrNull()を用いて数値に変換すること。
    • 変換が成功した場合、その数値を利用すること。
    • 変換が失敗した場合、エルビス演算子(?:)を使って値を0に設定すること。
  3. 入力値をもとに計算を行い、以下を表示すること:
    • 入力された数値
    • 入力された数値に1を加えた値

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

数値を入力してください(例: 123):
入力された数値:123  
入力された数値に1を足した結果:124
数値を入力してください(例: 123):
入力された数値:0  //abcと入力した場合
入力された数値に1を足した結果:1

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:main関数の定義
  □ 「数値を入力してください(例: 123):」と出力
  □ readLine関数で入力を受け取り、文字列型の変数inputに代入
  □ 変数inputをtoIntOrNullで整数型に変換し、numberに代入(変換できない場合はnull)
  □ エルビス演算子を使用して、numberがnullの場合は0をresultに代入
  □ 「入力された数値:」と出力
  □ 変数resultの値を出力
  □ 「入力された数値に1を足した結果:」と出力
  □ 変数resultに1を足した値を出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

fun main() {
    // ユーザーから数値の入力を受け取る
    println("数値を入力してください(例: 123):")
    val input = readLine() // 入力を受け取り文字列として保存します

    /*【穴埋め問題1】
    ここで入力された値を整数に変換し、変数numberに代入してください。数字でない場合はnullを代入してください。
    */

    /*【穴埋め問題2】
    ここでエルビス演算子を使って、numberがnullの場合は0を変数resultに代入してください。
    */

    // 結果を出力
    print("入力された数値:")
    println(result)
    print("入力された数値に1を足した結果:")
    println(result + 1)
}

以上がこの問題の穴埋めコードです。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

// メイン関数 - Kotlinプログラムのエントリーポイント
fun main() {
    // ユーザーから数値の入力を受け取る
    println("数値を入力してください(例: 123):")
    val input = readLine() // 入力を受け取り文字列として保存します

    // 入力された値を整数に変換します。数字でない場合はnullが返されます。
    val number: Int? = input?.toIntOrNull()

    // Null安全性の確認 - nullの場合とnullでない場合で処理を分ける
    val result: Int = number ?: 0 // エルビス演算子を使用して、nullの場合は0を代入

    // 結果を出力
    print("入力された数値:")
    println(result)
    print("入力された数値に1を足した結果:")
    println(result + 1)
    /*
     * 説明:
     * 1. toIntOrNull()は文字列を整数に変換しますが、変換できない場合はnullを返します。
     * 2. ?:(エルビス演算子)は、変数がnullの場合にデフォルト値を設定します。
     * 3. このコードでは、nullの場合に0を代入しています。
     */
}

正解コードの解説

今回作成したコードは、ユーザー入力を受け取り、その値を安全に数値として処理するプログラムです。

このコードではKotlinの「Null安全性」を活用し、入力値が無効(例: 数字でない場合)でもエラーが発生しないようにしています。

以下、コードをブロックごとに分割して詳しく解説します。

メイン関数の定義

fun main() {
    println("数値を入力してください(例: 123):")
  • fun main(): Kotlinプログラムのエントリーポイントです。この関数の中にプログラム全体の処理が記述されています。
  • println(): 画面に文字を表示するための関数です。ここでは「数値を入力してください」というメッセージを表示しています。

ユーザー入力の取得

val input = readLine()
  • val input: 定数を宣言しています。valは再代入できない変数を定義するために使用します。
  • readLine(): ユーザーから文字列を入力するためのKotlin標準関数です。ここでは入力された値をinputに格納しています。

Null安全性を活用した値の変換

val number: Int? = input?.toIntOrNull()
  1. Int?: この型は「Nullable型」と呼ばれ、値がnullになる可能性があることを示します。
  2. input?.toIntOrNull():
    • toIntOrNull()は文字列を整数に変換する関数です。変換できない場合はnullを返します(例: 入力がabcの場合)。
    • ?(安全呼び出し演算子)を使うことで、inputnullの場合でもエラーが発生せず、そのままnullを返します。

Null安全性を利用したデフォルト値の設定

val result: Int = number ?: 0
  • エルビス演算子(?:: Null安全性を実現するためのKotlinの演算子です。numbernullの場合、右側の値(ここでは0)が代入されます。
  • このコードではnumbernullならば0を、そうでなければnumberの値をresultに代入します。

結果の出力

    print("入力された数値:")
    println(result)
    print("入力された数値に1を足した結果:")
    println(result + 1)
  • 結果を表示してす。

まとめ

このプログラムはKotlinの「Null安全性」を利用して、ユーザーが不正な値(例: 数字以外の文字列)を入力した場合でも、エラーが発生しないように設計されています。

特にtoIntOrNull()とエルビス演算子(?:)を活用することで、入力値の安全な処理を実現しています。

このコードを理解することで、Null安全性の基本的な使い方を学ぶことができるでしょう。

Kotlinのエラー回避機能は初心者にも扱いやすく、これを活用することで安全で堅牢なコードを書くスキルを身につけることができます。

ぜひ他の例でもtoIntOrNull()やエルビス演算子を試しながら学習を進めてみてください!

<<前のページ Kotlin記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Kotlinのテキスト&問題集トップへ戻る
    トップページへ戻る