Kotlinのtry-catch-finallyを使った例外処理の基本!初心者でもわかるエラー対策の書き方
生徒
「Kotlinで、途中でエラーが起きたときってどうすれば止まらずにプログラムを続けられますか?」
先生
「そういうときには、try-catch-finallyという構文を使って、エラー(例外)を処理できますよ。」
生徒
「tryとかcatchって英語みたいですね。どんなふうに使うんですか?」
先生
「では、Kotlinのtry-catch-finally構文を使った例外処理の基本を一緒に学びましょう!」
1. try-catch-finallyとは?
try-catch-finallyは、Kotlinでプログラムの途中で起こるエラー(例外)を安全に処理するための構文です。
まず「例外(エラー)」とは、プログラムの実行中に起きる予期しない問題のことです。たとえば、「0で割り算した」「数字じゃない文字を数字に変換しようとした」などが例外の代表例です。
Kotlinでは、こうした例外が起きそうな場所をtryで囲んで、エラーが出たときはcatchで対処します。そして、最後に必ず実行したい処理があればfinallyで書きます。
2. try-catchの基本的な書き方
次は、try-catchを使ったKotlinの基本的な例外処理の例です。
fun main() {
try {
val num = "abc".toInt() // 文字列を数値に変換しようとする
println(num)
} catch (e: NumberFormatException) {
println("数値に変換できませんでした")
}
}
この例では、「abc」という文字列を数字に変換しようとして失敗します。そのため、catchに書かれたメッセージが表示されます。
数値に変換できませんでした
catch (e: NumberFormatException)のように、どんな種類のエラーに対処するかを指定できます。
3. finallyで必ず実行される処理を書く
finallyブロックは、エラーが起きても起きなくても、必ず実行される処理を書く場所です。ファイルを閉じる、後片付けをする、などでよく使います。
fun main() {
try {
val num = 100 / 0 // 0で割り算 → エラー
println(num)
} catch (e: ArithmeticException) {
println("0で割ることはできません")
} finally {
println("プログラム終了処理")
}
}
0で割ることはできません
プログラム終了処理
このように、finallyに書かれた部分は必ず実行されるので、最後の挨拶やクリーンアップ処理に適しています。
4. 例外処理が必要な理由とは?
プログラムは、思わぬ入力や状況で止まってしまうことがあります。例えば、ユーザーが想定外の文字を入力したり、ネットが切れたりすることがあります。
そんなとき、エラーが起きても途中で止まらず、安全に処理を続けられるようにするのが、例外処理(try-catch-finally)の役割です。
例外処理がないと、プログラムが落ちたり、黒い画面でエラーメッセージだけが出てしまうことがあります。
5. いろいろな例外に対応するには?
catchは複数書くこともできます。たとえば、いくつかの種類の例外に対応する場合、次のようにできます。
fun main() {
try {
val nums = listOf(1, 2, 3)
println(nums[5]) // 存在しないインデックスを参照
} catch (e: IndexOutOfBoundsException) {
println("範囲外の値にアクセスしました")
} catch (e: Exception) {
println("何らかのエラーが発生しました")
}
}
この例では、リストに存在しない位置を参照してエラーになります。IndexOutOfBoundsExceptionで個別に対処できます。
6. tryを使って式として値を返すこともできる
Kotlinのtryは式としても使えます。つまり、値を返すことができます。
val result = try {
"123".toInt()
} catch (e: NumberFormatException) {
0
}
println(result)
123
この例では、「123」を数値に変換できたのでそのまま使われますが、変換に失敗したときはcatchの0が代わりに使われます。
まとめ
Kotlinの例外処理は、安全に安定したプログラムを書くために欠かせない重要な仕組みであり、今回学んだtry-catch-finallyの流れは、初心者が最初に知っておきたい基本の土台です。とくに、数字に変換できない文字列を扱う場面、存在しないインデックスにアクセスしてしまう場面、ゼロで割り算するような場面など、日常の開発でも起こりやすいエラーを丁寧に処理するためには、tryで囲みcatchで受け止め、必要ならfinallyで後処理を行う流れが非常に大切になります。例外処理を正しく使うことで、プログラムが途中で止まってしまうことを防ぎ、ユーザーにとって安心して使えるアプリケーションへとつながります。 また、Kotlinではtryを「式」として扱える点も特徴であり、エラーの有無に応じて戻り値を切り替える書き方は、短く読みやすく書けるため実務でも多用されます。複数catchを使った例では、発生したエラーの種類に応じた細かな対処もでき、例外ごとの適切なメッセージ表示やログ記録なども実装しやすくなります。こうした柔軟な書き方によって、エラーが起きても慌てず、論理的にプログラムの流れを保つことが可能になります。 さらに、例外処理はファイル操作や通信処理など、失敗する可能性のある処理では特に欠かせません。たとえば、読み込み途中でファイルが見つからない、ネットワーク通信が途中で切れるなど、外部の環境に左右される処理ほど例外が発生しやすくなります。そこでtry-catch-finallyを組み合わせることで、エラーを受け止めるだけでなく、リソースの開放や後片付けも安全に行えるようになり、プログラムの信頼性が大きく向上します。今回の記事で扱った例は身近で理解しやすいものばかりですが、この考え方はより大きなアプリケーションでも活用される大切な基礎です。 次の学習では、独自の例外を作って投げたり、例外をまとめて処理したりする応用的な使い方も広がっていきます。まずは今回の内容を丁寧に理解し、try-catch-finallyがどのように動いているのか、どんな場面で役に立つのかを自分で試しながら感覚として身につけることが大切です。
サンプルプログラムでtry-catch-finallyを総復習
ここでは、記事で学んだポイントを整理するために、複数の例外を扱いながら値を返す処理も含めた総合的なサンプルコードを紹介します。
fun main() {
println("数値変換の例:")
val convertResult = try {
"456".toInt() // 全角数字は例外になる
} catch (e: NumberFormatException) {
println("全角文字は変換できませんでした")
-1
} finally {
println("変換処理を終了します")
}
println("結果:$convertResult")
println("リスト参照の例:")
val list = listOf(1, 2, 3)
try {
println(list[10])
} catch (e: IndexOutOfBoundsException) {
println("範囲外アクセスを検出しました")
}
println("ゼロ除算の例:")
try {
val div = 100 / 0
println(div)
} catch (e: ArithmeticException) {
println("0で割ることはできません")
} finally {
println("割り算処理を終了します")
}
}
このサンプルでは、全角文字の数値変換、存在しないリスト参照、ゼロ除算という三つの例外が発生しやすい場面をまとめて確認できます。実際に動かしてみることで、catchがどのタイミングで動き、finallyが必ず実行されることも自然と理解できます。例外処理は文章だけ読むよりも手を動かす方が理解が進むので、ぜひ自分の環境でも試してみてください。
生徒
「今日のtry-catch-finallyの内容、すごく理解できました!エラーが起きても止まらずに続けられる仕組みなんですね。」
先生
「その通りです。例外処理は安全なプログラムを書くための基本なので、しっかり覚えておくと今後必ず役に立ちますよ。」
生徒
「全角文字が数値に変換できないっていうのも実験してみて納得しました。finallyが必ず動くのも面白いですね。」
先生
「finallyは後片付けのための大事な場所です。ファイル操作やネットワーク処理でもよく使われますよ。」
生徒
「複数catchを使ってエラーごとに違うメッセージを出すのも便利だと思いました!」
先生
「良い気づきですね。種類ごとに丁寧に分けることで、あとから原因を追いやすくなる大切なポイントです。」
生徒
「次は自分でも例外を投げてみたり、tryを使って返り値を作る処理を練習してみます!」
先生
「とても良い姿勢です。今日の内容をもとに、もっと自由に書けるように練習していきましょう。」