Kotlinの例外処理の基本!try-catch-finallyの書き方を解説
生徒
「Kotlinでプログラムが途中で止まらないようにエラーを処理するにはどうすればいいんですか?」
先生
「Kotlinではtry-catch-finallyという仕組みを使って、エラー(例外)をキャッチして安全に処理できます。」
生徒
「それって他のプログラムでもよく使うんですか?」
先生
「はい、ほとんどのプログラミング言語で似たような仕組みがあります。初心者でも理解しやすいように具体例で説明しますね。」
1. 例外処理(try-catch-finally)とは?
プログラムを実行しているとき、開発者が予想もしなかったタイミングで発生するトラブルを「例外(Exception)」と呼びます。例えば、「インターネットがつながっていないのにデータを取得しようとした」「数字を入力すべき場所に文字を入力した」といったケースです。
もし例外が発生したとき、何の対策もしていないとアプリは突然強制終了してしまいます。これを防ぎ、エラーが起きても「今は通信が不安定ですよ」と優しくメッセージを出したり、安全に処理を続けたりするために、Kotlinではtry-catch-finallyという構文を使います。
構成は以下の3つの役割に分かれています。
- try : 「エラーが起きるかもしれないけど、まずはやってみる処理」を書く場所です。
- catch : もしエラーが起きたとき、「どうやって助けるか(対処法)」を書く場所です。
- finally : エラーが起きても起きなくても、「最後に必ず片付け」をする場所です。
例えば、お料理で例えると「try:レシピ通りに作る」「catch:焦がしてしまったら作り直す」「finally:最後は必ずコンロの火を消して片付ける」という流れに似ています。プログラミング未経験の方でも、この3つのステップをセットで覚えることで、壊れにくいプログラムが書けるようになります。
2. Kotlinでの例外処理(try-catch-finally)の基本的な書き方
プログラミングをしていると、予期せぬエラー(例外)が発生してアプリが止まってしまうことがあります。そんな時、エラーをスマートに回避して処理を継続させるための仕組みが「例外処理」です。Kotlinでは、主にtry、catch、finallyという3つのブロックを組み合わせて記述します。
まずは、初心者の方でも分かりやすい「0で割り算をしてしまった場合」のサンプルコードを見てみましょう。
fun main() {
// 1. まずはtryの中で実行したい処理を書く
try {
val number = 10
val divisor = 0 // 0で割ろうとするとエラーが発生する
val result = number / divisor
println("計算結果は $result です")
}
// 2. エラーが発生した場合の予備動作をcatchに書く
catch (e: ArithmeticException) {
println("【エラー発生】0で数値を割ることはできません。")
println("詳細メッセージ: ${e.message}")
}
// 3. 成功しても失敗しても必ず実行したい処理をfinallyに書く
finally {
println("計算処理を終了します。")
}
}
【エラー発生】0で数値を割ることはできません。
詳細メッセージ: / by zero
計算処理を終了します。
このプログラムのポイントは、たとえ途中で計算エラーが起きても、アプリが強制終了せずにcatchブロックの内容を実行し、最後にfinallyで綺麗に処理を締めくくっている点です。finallyは、ファイルのクローズ処理やデータベースの切断など、後片付けが必要な場面で非常によく使われる重要なパーツです。
3. 複数の例外を個別にキャッチして処理を分ける
プログラムを実行していると、「数字ではない文字を無理やり数値に変えようとした(NumberFormatException)」や「存在しないデータにアクセスした」など、複数の異なるトラブルが同時に予想される場面があります。そんな時は、catchブロックを並べて書くことで、エラーの種類に応じた「専用の解決策」を準備できます。
例えば、下記のサンプルでは入力ミスには優しく、それ以外の想定外のエラーには慎重に対応するよう書き分けています。
fun main() {
try {
val text = "Kotlin" // 数字ではない文字列
val number = text.toInt() // ここでNumberFormatExceptionが発生
val result = 100 / 0 // 数値変換が成功しても、ここで別のエラー(算術エラー)が出る可能性がある
} catch (e: NumberFormatException) {
// 数値変換エラー専用の処理
println("【入力エラー】数字を入力してください(詳細: ${e.message})")
} catch (e: Exception) {
// 上記以外の、あらゆるエラーをまとめて受け取る処理
println("【予期せぬエラー】問題が発生しました(種類: ${e.javaClass.simpleName})")
}
}
ここで重要なポイントは、「具体的なエラー(NumberFormatException)」を先に書き、「何でも受け取るエラー(Exception)」を最後に書くという順番です。Googleの検索ユーザーもよく探している通り、この順番を逆にすると、すべてが最初のブロックに吸収されてしまい、エラーごとの適切なメッセージが出せなくなるので注意しましょう。
4. finallyの活用例:必ず実行したい「後片付け」のルール
プログラミングにおいて、finallyブロックは「何があっても、最後に必ず通る場所」という非常に重要な役割を持っています。例えば、スマートフォンのアプリで写真を選んだ後や、大事なファイルを読み書きした後は、使い終わったリソースを元の状態に戻す(解放する)必要があります。これを怠ると、スマホの動作が重くなったり、メモリ不足でエラーが起きたりする原因になります。
エラーが発生して処理が途中で止まってしまったとしても、finallyの中に「終了処理」を書いておけば、確実に後片付けを実行できます。初心者の方は「try-catchの締めくくりにはfinallyを添える」と覚えておくと、トラブルに強い安全なコードが書けるようになります。
fun main() {
// リソース(ファイルなど)の準備状況を管理する変数
var isConnectionOpen = false
try {
println("1. データベースへの接続を開始します...")
isConnectionOpen = true
// ここで予期せぬエラー(通信トラブルなど)が発生したと仮定します
throw RuntimeException("インターネット接続が不安定です")
println("ここは実行されません") // エラー発生以降のtry内はスキップされる
} catch (e: Exception) {
// エラーが起きた時の「お助け処理」
println("2. 【エラー検知】${e.message}。復旧を試みます。")
} finally {
// エラーが起きても起きなくても、絶対に実行される「後片付け」
if (isConnectionOpen) {
println("3. 【後片付け】安全に接続を終了しました。メモリを解放します。")
}
}
println("プログラムを終了します。")
}
このサンプルでは、tryの中で意図的にエラーを発生させていますが、プログラムは強制終了することなくcatchで内容を報告し、最後にfinallyで「安全に接続を終了」させています。この一連の流れを組むことで、ユーザーに不便をかけない信頼性の高いアプリが作れるようになります。
5. tryを式として使う(戻り値の活用)
Kotlinの大きな特徴の一つに、「tryを式として扱える」という点があります。Javaなどの他の言語では、例外処理は単なる「手続き」ですが、Kotlinでは処理した結果をそのまま変数に代入することが可能です。
例えば、「入力された文字を数字に変換する」という場面を考えてみましょう。もし数字以外の文字が混じっていてエラー(例外)が発生しても、プログラムを止めずに「失敗した時は0にする」といった振る舞いを、たった数行でスマートに記述できます。これにより、if文を多用するよりもコードがスッキリし、読みやすさが格段に向上します。
fun main() {
// 文字列を数値に変換しようとする例
val input = "123"
// tryの結果を直接numberに代入
val number = try {
input.toInt() // 成功すればこの値が代入される
} catch (e: NumberFormatException) {
0 // エラーが発生した場合は、この「0」が代入される
}
println("結果の値は: $number")
}
結果の値は: 123
プログラミング未経験の方にとって、エラー(例外)は怖いものに感じるかもしれません。しかし、このようにtryを式として使うことで、「予期せぬ事態が起きても、安全に代わりの値を設定する」という仕組みを簡単に作ることができます。これは、安全かつ簡潔なコードを重視するKotlinらしい便利な書き方です。
6. プログラミング初心者が気をつけるべき例外処理の4つのポイント
例外処理(try-catch)は、エラーによるアプリの強制終了を防ぐ強力なツールですが、使い方を誤るとバグの特定が難しくなる「諸刃の剣」でもあります。初心者が陥りやすいミスを防ぐための重要ポイントを詳しく見ていきましょう。
1. エラーの種類に合わせて「網」を使い分ける
「何かエラーが起きたらとりあえずキャッチする」のではなく、「どんなエラーが起きそうか」を予測して個別に処理を書くのが基本です。例えば、数字を0で割った時のエラーと、ファイルが見つからない時のエラーでは、対処法が異なるからです。
2. むやみにエラーを隠さない
catchの中身を空にしてしまうと、エラーが発生しても何も表示されず、プログラムが「なぜか動かない」という一番厄介な状況になります。開発中は必ずエラー内容を出力し、原因を特定できるようにしましょう。
3. 最後に必ずやりたいことは「finally」に任せる
エラーが起きても起きなくても、最後に必ず実行したい処理(開いたファイルを閉じる、通信を終了するなど)はfinallyブロックに記述します。
【具体例】割り算プログラムで学ぶ例外処理
ユーザーが入力した数字で割り算をする、簡単なKotlinのサンプルコードです。
fun main() {
val input = "0" // ユーザーが0を入力したと想定
try {
println("計算を開始します")
val result = 100 / input.toInt()
println("結果は ${result} です")
} catch (e: ArithmeticException) {
// 0で割ったとき専用のエラー対処
println("エラー:0で割ることはできません!")
} catch (e: Exception) {
// その他の予期せぬエラーへの対処
println("予期せぬエラーが発生しました: ${e.message}")
} finally {
// 成功しても失敗しても必ず実行される
println("計算処理を終了しました。")
}
}
このコードでは、ArithmeticException(算術エラー)を個別に指定しているため、原因がひと目でわかります。また、finallyのおかげで、最後に必ず終了メッセージが表示されるようになっています。
4. 例外処理の範囲を広げすぎない
プログラム全体を一つのtryで囲ってしまうと、どこでエラーが出たのか特定が難しくなります。「エラーが起きそうな一行」をピンポイントで囲むのが、きれいなコードを書くコツです。
Kotlinを基礎からしっかり学びたい人や、 Java経験を活かしてモダンな言語にステップアップしたい人には、 定番の入門書がこちらです。
基礎からわかるKotlinをAmazonで見る※ Amazon広告リンク
まとめ
Kotlinの例外処理の基本を総合的に理解する
Kotlinの例外処理は、安全で安定したアプリケーション開発を行うために欠かせない重要な技術です。プログラミングを行う上で、エラーやトラブルは必ず発生します。そのため、エラーを完全に防ぐことよりも、発生したときにどのように処理するかを理解することが重要になります。
本記事で解説したtry catch finally構文は、Kotlinにおける例外処理の基本となる仕組みです。tryはエラーが発生する可能性のある処理を記述し、catchはエラー発生時の対処を行い、finallyは必ず実行したい後処理を記述します。この三つの役割を正しく理解することで、プログラムが途中で停止することを防ぎ、ユーザーに優しいアプリケーションを作成することができます。
try catch finallyの実務での重要性
実務の開発現場では、ユーザー入力や外部サービスとの通信、ファイル操作など、例外が発生しやすい処理が多く存在します。そのため、try catch finallyを適切に使うことで、エラーが発生してもサービスが停止しない仕組みを作ることが求められます。
特に初心者が意識すべきポイントは、すべての処理を例外処理で囲むのではなく、本当にエラーが起きる可能性がある箇所にだけ適用することです。また、catchでは単にエラーを無視するのではなく、ユーザーに分かりやすいメッセージを表示することが大切です。
複数の例外処理とエラーごとの対応
Kotlinでは、複数のcatchブロックを使って異なる例外を個別に処理できます。これにより、エラーの種類に応じた適切な対応が可能になります。例えば、入力エラーと計算エラーではユーザーへの案内も異なるため、それぞれ分けて処理することが重要です。
また、Exceptionのような広い範囲の例外を扱う場合は、具体的な例外より後に記述する必要があります。この順番を守ることで、より精度の高いエラー処理が実現できます。
finallyの役割とリソース管理の重要性
finallyは、エラーの有無に関わらず必ず実行される処理を記述するためのブロックです。ファイルのクローズやデータベース接続の終了など、後片付けにあたる処理を記述することで、システムの安定性を保つことができます。
この考え方は、実務において非常に重要です。リソースの解放を怠ると、メモリ不足やパフォーマンス低下の原因となるため、finallyの役割を正しく理解しておくことが必要です。
tryを式として使うKotlin特有の書き方
Kotlinの特徴として、tryを式として利用できる点も重要です。これにより、例外処理の結果をそのまま変数に代入することができ、コードを簡潔に書くことが可能になります。エラー時に代替値を設定する処理を簡単に実装できるため、実務でも頻繁に利用されるテクニックです。
fun main() {
val input = "abc"
val result = try {
input.toInt()
} catch (e: NumberFormatException) {
0
}
println("変換結果: $result")
}
変換結果: 0
このように、tryを式として活用することで、エラーに強く読みやすいコードを書くことができます。Kotlinらしい書き方として、ぜひ習得しておきましょう。
初心者が意識すべき例外処理の考え方
初心者の方は、例外処理を難しく考えすぎる必要はありません。まずは、エラーが発生する可能性がある箇所を見つけ、そこで適切な対処を行うことを意識しましょう。例えば、ユーザー入力の変換処理や、外部との通信部分などは、例外処理が必要になる代表的な箇所です。
また、エラーを隠すのではなく、原因を把握できるようにすることも重要です。ログを出力したり、エラーメッセージを適切に表示することで、問題の解決がしやすくなります。
Kotlinの例外処理を理解することで、アプリケーションの品質を高め、ユーザーにとって使いやすいサービスを提供できるようになります。基礎をしっかりと身につけて、実務でも活用できるスキルとして定着させていきましょう。
生徒
「Kotlinのtry catch finallyの使い方がかなり理解できました。エラーが出ても止まらない仕組みが大事なんですね」
先生
「その通りです。例外処理はアプリの安定性を支える重要な仕組みです」
生徒
「finallyは必ず実行されるから後片付けに使うんですね」
先生
「はい。リソース管理では特に重要です」
生徒
「複数のcatchでエラーごとに分けるのも分かりやすかったです」
先生
「実務では必須の考え方です。ユーザーに適切な案内ができます」
生徒
「tryを式として使えるのはKotlinらしいですね」
先生
「簡潔で安全なコードを書くための強力な機能です」
生徒
「これからはエラーが出ても原因を考えて対応できそうです」
先生
「その意識があれば実務でも通用します。しっかり身につけていきましょう」
【未経験OK】Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験する60分
「プログラミングを始めたい」を形にする。最新言語Kotlinで楽しむ、ものづくりの第一歩。
本講座は、プログラミング経験が全くない方のためのエントリー講座です。「コードを書くってどういうこと?」という基本から、世界中で使われている最新言語Kotlin(コトリン)を使って、実際にプログラムを動かすまでを体験します。難しい理屈よりも、まずは「自分の手で動かす楽しさ」を最短距離で実感していただきます。
具体的な体験内容と環境
【つくるもの】
簡単な言葉を入力すると自動で返答してくれる「対話型ミニプログラム」や、計算を自動化する「便利ツール」をゼロから作成します。黒い画面に自分の書いた文字が表示される瞬間は、最高の感動体験です。
【開発環境】
プロのエンジニアが実際に使っている開発ツールIntelliJ IDEA(インテリジェイ)をインストールします。ボタン一つで日本語化し、初心者でも迷わず操作できる「魔法の設定」を一緒に行います。
この60分で得られる3つの体験
プロと同じ道具を揃えることで、明日から一人でもプログラミングを続けられる環境が整います。
「変数」や「型」といった難しい言葉も、身近な例え話で解説。モヤモヤをゼロにします。
Kotlinは英語に近くて読みやすいのが特徴。自分でコードを読んで、間違いを見つけるコツも伝授します。
※本講座は、パソコン操作が不安な方でも安心して受講いただける完全マンツーマンです。あなたのペースに合わせて、一つずつ丁寧に進めていきます。
Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験