【Kotlin】レッスン2-09:例外処理を理解しよう

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

この記事で学べる知識:例外処理

この記事の練習問題を解くために必要な知識:
基礎文法(レッスン1)比較演算子と論理演算子if文による分岐処理when文による分岐処理スマートキャストfor文による繰り返し処理while文による繰り返し処理繰り返しの制御エラーメッセージ例外処理

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

Kotlinの文法「例外処理」とは

ここでは例外処理の意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。



プログラムを作成する際、予期しないエラーが発生することがあります。

例外処理を活用することで、エラーによるプログラムの停止を防ぎ、安全に動作させる仕組みを構築できます。

例外処理とは?

例外とはプログラム実行中に発生する予期しないエラーのことです。例えばゼロによる割り算や存在しないファイルへのアクセスなどが挙げられます。

Kotlinでは例外を「throw」して通知し、適切に「キャッチ」して処理する仕組みが提供されています。

これによりエラーを効率的に管理し、プログラムの停止を防ぐことが可能です。

基本構文: try-catch文とfinallyブロック

Kotlinでは例外処理のためにtry-catch構文が利用されます。

また処理の終了時に必ず実行されるコードを記述するためにfinallyブロックも使用できます。

try {
    // 例外が発生する可能性があるコード
    val number = "abc".toInt() // ここで例外が発生
} catch (e: NumberFormatException) {
    // 発生した例外をキャッチして処理
    println("エラー: 数値に変換できません")
} finally {
    // 必ず実行されるコード
    println("終了処理")
}
  • try: エラーが発生する可能性のあるコードを囲みます。
  • catch: 発生した例外を受け取り、適切な処理を行います。
  • finally: tryまたはcatchブロックの後に必ず実行されるコードを記述します。

例外処理の使用例

例外処理を活用してユーザー入力を安全に処理するプログラムを例に説明します。

fun main() {
    println("数字を入力してください:")
    val input = readLine()

    try {                                       // エラーが発生するかもしれない部分をtru{}で囲う
        val number = input?.toInt()
        println("入力された数値は: $number")
    } catch (e: NumberFormatException) {        // NumberFormatExceptionエラーを見つけた場合の処理
        println("エラー: 数値を入力してください")
    } finally {                                 // エラーの有無に関わらず実行される処理
        println("プログラムを終了します")
    }
}

このプログラムではユーザーが不正な値を入力しても適切にエラーを処理し、プログラムが停止しないようになっています。

例外処理を使うメリット

例外処理を利用することで以下の利点があります。

  1. プログラムの安定性向上: エラーが発生してもプログラムの続行が可能です。
  2. エラーハンドリングの簡略化: エラーごとに適切な処理を記述することができます。
  3. デバッグの効率化: エラーの原因を明確にし、修正を迅速に行えます。

まとめ

例外処理は安全なプログラムを作る上で欠かせない技術です。

Kotlinのtry-catch構文とfinallyブロックを活用すれば、エラーの発生に備えたコードを書くことができます。

Kotlin練習問題2-4:例外処理を理解しよう

ユーザーから入力された整数を検証するプログラムを作成してください。

整数ではない文字が入力された場合は、例外処理を用いて対応しましょう。

この問題の要件

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

  • ユーザーに整数を入力するよう促し、入力を受け取る。
  • 入力された値が整数でない場合、例外処理を使用してエラーメッセージを表示し、再度入力を促す。
  • 正しい整数が入力されるまで、入力を繰り返すこと。
  • 最終的に、入力された正しい整数を画面に表示する。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

整数を入力してください:
abc
無効な入力です。整数を入力してください。
整数を入力してください:
123
入力された整数は: 123 です。

この問題を解くヒント

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

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

正解のコードは上から順に以下のような構成となっています。

1:メイン関数の定義
  □ 変数numberをInt型のNullableとして宣言し、nullで初期化
  □ while文による繰り返し処理開始(条件:numberがnullである場合)
  □ □ 「整数を入力してください:」と出力
  □ □ ユーザー入力を受け取り、変数inputに代入
  □ □ tryブロック開始
  □ □ □ inputを整数型に変換し、変数numberに代入
  □ □ catchブロック開始(例外:NumberFormatException)
  □ □ □ 「無効な入力です。整数を入力してください。」と出力
  □ 入力された整数を「入力された整数は: $number です。」として出力

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

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

fun main() {
    /* 【穴埋め問題1】
    ここにnullableな整数型変数numberをnullで初期化するコードを書いてください。
    */
    var number: Int? = null

    // ユーザーから整数の入力を受け取るまで繰り返す
    while (number == null) {
        /* 【穴埋め問題2】
        ここに"整数を入力してください:"と表示するコードを書いてください。
        */
        println("整数を入力してください:")

        /* 【穴埋め問題3】
        ここにユーザーからの入力を受け取るコードを書いてください。
        */
        val input = readLine()

        try {
            /* 【穴埋め問題4】
            ここに入力を整数に変換し、成功したらnumberに代入するコードを書いてください。
            */
            number = input?.toInt()
        } catch (e: NumberFormatException) {
            // 整数に変換できなかった場合、エラーメッセージを表示
            /* 【穴埋め問題5】
            ここに"無効な入力です。整数を入力してください。"と表示するコードを書いてください。
            */
            println("無効な入力です。整数を入力してください。")
        }
    }

    /* 【穴埋め問題6】
    ここに"入力された整数は: $number です。"と表示するコードを書いてください。
    */
    println("入力された整数は: $number です。")
}

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

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

練習問題の解答と解説

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

正解コードの例

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

fun main() {
    var number: Int? = null

    // ユーザーから整数の入力を受け取るまで繰り返す
    while (number == null) {
        println("整数を入力してください:")
        val input = readLine() // 入力を受け取る

        try {
            // 入力を整数に変換し、成功したらnumberに代入
            number = input?.toInt()
        } catch (e: NumberFormatException) {
            // 整数に変換できなかった場合、エラーメッセージを表示
            println("無効な入力です。整数を入力してください。")
        }
    }

    // 正しい整数が入力された場合に、その値を表示
    println("入力された整数は: $number です。")
}

正解コードの解説

このコードはユーザーから整数を入力してもらい、その値を安全に取得して表示する処理を行います。

例外処理を特に強調して解説します。

main関数の開始

fun main() {
    var number: Int? = null
  • fun main() {Kotlinプログラムのエントリーポイントです。全てのプログラムはmain関数から開始します。
  • var number: Int? = nullnumber は可変変数(var)として定義され、データ型は整数型(Int)。?をつけることでnullを許容しています。初期値はnullです。

入力ループの開始

    while (number == null) {
        println("整数を入力してください:")
        val input = readLine()
  • while (number == null)ループ条件はnumbernullの間です。つまりユーザーが有効な整数を入力するまで繰り返します。
  • println("整数を入力してください:")コンソールにメッセージを表示してユーザーに整数の入力を促します。
  • val input = readLine()ユーザーの入力を受け取ります。この値は一旦文字列(String型)として扱われます。

入力値の処理と例外処理

        try {
            number = input?.toInt()
        } catch (e: NumberFormatException) {
            println("無効な入力です。整数を入力してください。")
        }
    }
  • try { ... } catch (e: NumberFormatException) { ... }入力された文字列を整数型(Int)に変換する処理を例外処理で囲んでいます。これは不正な値(例: 文字や記号)が入力された場合にプログラムがクラッシュしないようにするためです。
  • input?.toInt()toInt() メソッドは文字列を整数型に変換します。?(セーフコール演算子)は、inputnullの場合にエラーを回避します。
  • catch (e: NumberFormatException)変換中にエラーが発生した場合(例: abcIntに変換しようとした場合)、このブロックが実行されます。
  • println("無効な入力です。整数を入力してください。")エラーメッセージを表示して、ユーザーに再入力を促します。

正常な入力を受け取った後の処理

    println("入力された整数は: $number です。")

println("入力された整数は: $number です。")ユーザーが正しい整数を入力した場合、その値を画面に表示します。プログラムはここで終了します。

例外処理の重要性

このコードでは例外処理が重要な役割を果たしています。

例えばinput?.toInt()で文字列から整数への変換を行っていますが、無効な入力(例: abc)はエラーを発生させます。

このエラーをキャッチすることで、プログラムを止めることなくユーザーに再入力を求めることができます。

まとめ

このコードはユーザー入力を安全に処理する方法を示しています。

特に例外処理を活用することで無効な入力に対する対策を行い、プログラムの信頼性を向上させています。

例外処理はKotlinに限らず、多くのプログラミング言語で重要なテクニックです。

このコードを理解することで、エラーに強いプログラムを書く第一歩を学ぶことができます。

学んだ内容をぜひ他のプロジェクトでも応用してみてください!

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

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

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

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






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