【Kotlin】レッスン2-9:例外処理を理解しよう|try-catch-finallyの基本

ながみえ

一つ前のページではエラーメッセージについて学習しました。

今回は 例外処理 について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編

 ・Lesson2-1:比較演算子と論理演算子を理解しよう
 ・Lesson2-2:if文による分岐処理を理解しよう
 ・Lesson2-3:when文による分岐処理を理解しよう
 ・Lesson2-4:スマートキャストを理解しよう
 ・Lesson2-5:for文による繰り返し処理を理解しよう
 ・Lesson2-6:while文による繰り返し処理を理解しよう
 ・Lesson2-7:繰り返しを制御しよう
 ・Lesson2-8:エラーメッセージを読めるようになろう
 ・Lesson2-9:例外処理を理解しよう ◁今回はココ
 ・確認問題2-☆1:ハイアンドローゲームを作ろう
 ・確認問題2-☆2:数字当てゲームを作ろう
 ・確認問題2-☆3:簡単なじゃんけんゲームを作ろう
Lesson3:関数編
Lesson4:コレクション編
Lesson5:オブジェクト指向編

<<前のページ

学習記事一覧

次のページ>>

例外処理とは?|安全なコードを書くための考え方

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

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

例外処理とは?|概要とtry-catch-finally構文の使い方

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

Kotlinでは例外を適切に「キャッチ」して処理する仕組みが提供されています。これによりエラーを効率的に管理し、プログラムの停止を防ぐことが可能です。

例外処理に使用する try-catch構文 の基本的な書き方は以下の通りです。

try {
    // 例外が発生する可能性があるコード
} catch (e: 例外名) {
    // 例が発生した際の処置
} finally {
    // 例外の有無に関わらず必ず実行されるコード
}
  • try: エラーが発生する可能性のあるコードを囲みます。
  • catch: 発生した例外を受け取り、適切な処理を行います。
  • finally: tryまたはcatchブロックの後に必ず実行されるコードを記述します。

例外処理のコード例|ユーザー入力値の型検証

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

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

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

このプログラムではユーザーが数値に変換できない文字列(例: abc)を入力しても適切にエラーを処理し、プログラムが停止しないようになっています。

例外処理の利点とは?|安定性・保守性・デバッグ性の向上

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

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

まとめ|安全なプログラムを書く第一歩

例外処理は、プログラムをより安全で信頼性の高いものにするために欠かせない仕組みです。

例外を適切にキャッチし、状況に応じて正しく対応することで、予期しないエラーによるプログラムの停止を防ぐことができます。

今後も例外処理を積極的に取り入れ、より高品質なコードを書いていきましょう。

練習問題|不正な入力に対応するプログラムを作ろう

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

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

この問題の要件

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

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

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

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

この問題を解くヒント

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

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

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

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

Q
ヒント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 です。")
}

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

この問題の解答と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
fun main() {
    var number: Int? = null

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

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

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

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

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)はエラーを発生させます。

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

Q
サイト改善アンケート & ご指摘/ご質問

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などを アンケート 形式でお伺いしています。

また記事の内容に関する ご指摘ご質問 もお待ちしています。

1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
※ 特定の記事に関する内容の場合は、記事番号(レッスン〇-〇)をご記入願います。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました