Kotlinの初心者向け問題2-4:例外処理を理解しよう
この問題を解くために必要な知識:
【レベル1~3の知識】
コメントの書き方、変数と定数、基本データ型、算術演算と論理演算、入力と出力、import文、配列、分岐処理(if、if~else、when)、繰り返し処理(for、while、do~while)、Null安全、スマートキャスト
【レベル3の知識】
関数の定義と呼び出し、関数の戻り値、関数のオーバーロード、ラベルとジャンプ、例外処理、クラスの定義と使用、インスタンス、コンストラクタ、プロパティ、クラスの継承、クラスの拡張
<<前の問題 | 問題集Top |
次の問題>> |
Kotlinの文法「例外処理」とは
ここでは例外処理の意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。
Kotlinを使い始めたばかりの方にとって、プログラムがエラーを起こして止まると戸惑うことがあるかもしれません。
そこで重要なのが、エラーに適切に対応するための例外処理です。今回は、Kotlinの例外処理について、初心者向けにわかりやすく解説します。
例外とは?
プログラムが実行中に予期しないエラーが発生すると、そのままではプログラムが停止してしまいます。
このような予期しないエラーのことを**例外(Exception)**と言います。
例外はさまざまな原因で発生します。例えば、存在しないファイルを読み込もうとしたり、ゼロで割り算をしたりすると例外が発生します。
例外処理の目的
例外処理の目的は、プログラムがエラーで停止することなく、安全に処理を続けることです。
Kotlinでは、例外が発生する可能性がある箇所を特定して、例外をキャッチ(捕捉)し、その後の処理を安全に続けることができます。
try-catch構文
Kotlinで例外を処理するためには、try-catch
構文を使用します。
try
ブロックに例外が発生する可能性のあるコードを記述し、catch
ブロックで例外が発生したときの処理を記述します。
以下は、例外処理の基本的な構文です。
try { // 例外が発生する可能性がある処理 } catch (e: Exception) { // 例外が発生したときに実行される処理 }
簡単な例
次のコードでは、ゼロで割り算を行ったときに発生する例外を処理しています。
fun main() { try { val result = 10 / 0 println(result) } catch (e: ArithmeticException) { println("エラー: ゼロで割ることはできません") } }
このコードを実行すると、10 / 0
で発生する**ArithmeticException
**がcatch
ブロックによってキャッチされ、「エラー: ゼロで割ることはできません」と表示されます。
例外が発生しない場合
try
ブロック内で例外が発生しなければ、catch
ブロックは実行されません。
例えば、次のコードではエラーが発生しないため、結果が正常に表示されます。
fun main() { try { val result = 10 / 2 println(result) } catch (e: ArithmeticException) { println("エラーが発生しました") } }
この場合の出力は「5」となり、catch
ブロックは無視されます。
finallyブロック
try-catch
構文には、さらに**finally
ブロック**を追加することができます。
このfinally
ブロックは、例外の発生に関係なく、最後に必ず実行される処理を記述するために使用します。
リソースの解放や後処理を行いたい場合に便利です。
fun main() { try { val result = 10 / 0 println(result) } catch (e: ArithmeticException) { println("エラー: ゼロで割ることはできません") } finally { println("処理が終了しました") } }
このコードを実行すると、次のような出力になります。
エラー: ゼロで割ることはできません 処理が終了しました
finally
ブロックは、例外が発生したかどうかに関わらず実行されるため、必ず「処理が終了しました」と表示されます。
複数の例外をキャッチする
複数の種類の例外に対応する場合、catch
ブロックを複数書くことができます。
例えば、次のコードは、数値を文字列に変換する際のエラーと、ゼロ除算のエラーをそれぞれ処理しています。
fun main() { try { val num = "abc".toInt() val result = 10 / 0 println(result) } catch (e: NumberFormatException) { println("エラー: 数値に変換できません") } catch (e: ArithmeticException) { println("エラー: ゼロで割ることはできません") } }
このコードでは、文字列「abc」を数値に変換できないため、NumberFormatException
がキャッチされ、「エラー: 数値に変換できません」と表示されます。
ゼロ除算のエラーも考慮していますが、最初の例外がキャッチされた時点でプログラムは次のcatch
に進まないため、この例ではArithmeticException
は処理されません。
まとめ
Kotlinの例外処理を使うことで、プログラムの実行中に発生するエラーに柔軟に対応し、プログラムを安全に続行することができます。
try-catch
構文を使って、エラーが発生したときの処理をあらかじめ決めておくことで、プログラムが予期せず停止することを防ぎます。
finally
ブロックを使えば、エラーが発生した場合でも、必ず実行したい後処理を定義することができます。
Kotlin練習問題2-4:例外処理を理解しよう
ユーザーから入力された整数を検証するプログラムを作成してください。
整数ではない文字が入力された場合は、例外処理を用いて対応しましょう。
この問題の要件
以下の要件に従ってコードを完成させてください。
- ユーザーに整数を入力するよう促し、入力を受け取る。
- 入力された値が整数でない場合、例外処理を使用してエラーメッセージを表示し、再度入力を促す。
- 正しい整数が入力されるまで、入力を繰り返すこと。
- 最終的に、入力された正しい整数を画面に表示する。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
整数を入力してください: abc 無効な入力です。整数を入力してください。 整数を入力してください: 123 入力された整数は: 123 です。
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.main関数の定義
1-1. 変数numberの宣言と初期化
1-2. whileループの開始
1-2-1. ユーザーへの整数入力の促しと入力の受け取り
1-2-2. 例外処理を用いた整数変換の試行
1-2-2-1. tryブロック内でtoInt()メソッドを使用して入力を整数に変換
1-2-2-2. catchブロック内で例外NumberFormatExceptionを捕捉し、エラーメッセージを表示
1-3. 入力が有効な整数であることを確認後、ループを抜ける
1-4. 入力された整数の表示
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
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プログラムのエントリーポイントです。ここからプログラムの実行が開始されます。var number: Int? = null
:number
という名前の変数を宣言しています。この変数はInt?
型で、整数かnull
を取ることができます。初期値としてnull
が設定されています。
入力を促すループ処理
while (number == null) { println("整数を入力してください:") val input = readLine() // 入力を受け取る
while (number == null)
:number
がnull
の間、ループが続きます。このループはユーザーが有効な整数を入力するまで繰り返されます。println("整数を入力してください:")
:ユーザーに整数の入力を促すメッセージを表示します。val input = readLine()
:ユーザーからの入力を受け取ります。readLine()
はコンソールから1行のテキストを読み取る関数です。
入力の検証と例外処理
try { number = input?.toInt() } catch (e: NumberFormatException) { println("無効な入力です。整数を入力してください。") } }
try
ブロック内でinput?.toInt()
を使って、入力された文字列を整数に変換しようとしています。input
がnull
でない場合は、toInt()
メソッドが呼び出され、number
に変換された整数が代入されます。catch (e: NumberFormatException)
:もし入力が整数に変換できなかった場合、NumberFormatException
という例外が発生します。この例外をキャッチして、エラーメッセージ「無効な入力です。整数を入力してください。」を表示します。
入力された整数の表示
println("入力された整数は: $number です。") }
- ループを抜けて、ユーザーが入力した正しい整数が
number
に代入されたら、その値を画面に表示します。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。