Kotlinのfinallyブロックの使い方を完全ガイド!初心者でもわかる例外処理の後片付け
生徒
「Kotlinの例外処理ってtryとcatchを使うんですよね?それ以外にも何かあるんですか?」
先生
「はい、もうひとつ大事な構文にfinallyというブロックがあります。」
生徒
「ファイナリー?それは何のために使うんですか?」
先生
「例外が起きても起きなくても、最後に必ず実行したい処理があるときに使います。実際に使い方を見ながら説明しましょう!」
1. Kotlinのfinallyブロックとは?役割とメリットを解説
finallyブロックとは、Kotlinの例外処理(エラーハンドリング)において、「エラーが起きても、起きなくても、最後に必ず実行する処理」を記述するための専用エリアです。
プログラミングをしていると、データの読み込み中にエラーが発生して処理が止まってしまうことがあります。しかし、エラーで止まったからといって「開きっぱなしのファイル」や「接続したままのデータベース」を放置すると、コンピュータの動作が重くなる原因になります。こうした事態を防ぐための「絶対に行う後片付け」がfinallyの役割です。
try(やってみる)や catch(エラーを捕まえる)の結果に左右されず、最終的に必ずここを通ります。
まずは、イメージを掴むためにごく簡単なプログラムを見てみましょう。ここでは「お片付け」をメッセージとして出力する例を紹介します。
fun main() {
println("--- 処理を開始します ---")
try {
println("1. ファイルを開いて読み込み中...")
// ここでエラーが起きても起きなくても...
} catch (e: Exception) {
println("2. エラーが発生した場合の処理")
} finally {
// エラーの有無にかかわらず、最後に必ずここが動く!
println("3. 【重要】開いたファイルを閉じて後片付け完了!")
}
println("--- すべての工程が終了 ---")
}
このように、finallyを使うことで「処理のやりっぱなし」を防ぎ、安全でクリーンなプログラムを書くことができるようになります。初心者の方は、「エラーに関係なく最後に絶対実行したいことはfinallyに書く」と覚えておきましょう。
2. try-catch-finallyの基本構文と役割
プログラムを実行中に予期せぬエラー(例外)が発生しても、アプリを強制終了させずに適切に処理するための仕組みがtry-catch-finallyです。プログラミング初心者の方でも分かりやすいよう、身近な算数の「0で割る」というエラーを例に、基本構文を解説します。
各ブロックの役割:
- try:エラーが起きそうな処理を書く場所
- catch:エラーが起きた時に「どう対処するか」を書く場所
- finally:成功・失敗に関わらず「最後に必ずやりたいこと」を書く場所
fun main() {
println("処理を開始します。")
try {
// 1. エラーが発生する可能性のある処理(10÷0は数学的にNG)
val result = 10 / 0
println("計算結果: $result") // エラーが起きるとこの行は飛ばされます
} catch (e: ArithmeticException) {
// 2. エラーが発生した時に実行される処理
println("【重要】計算エラー(${e.message})が発生したため、処理を中断して回避しました。")
} finally {
// 3. 成功しても失敗しても必ず実行される処理
println("後片付け:ファイルのクローズやメモリの解放など、最後に必ず実行される処理です。")
}
println("プログラムを安全に終了します。")
}
実行結果:
処理を開始します。
【重要】計算エラー(/ by zero)が発生したため、処理を中断して回避しました。
最後に必ず実行される処理です。
プログラムを安全に終了します。
上記のサンプルでは、10 / 0というエラーが起きた瞬間に、プログラムが止まるのではなくcatchブロックへジャンプしています。そして注目すべきはfinallyです。エラーが発生してもしなくても、最後の締めくくりとして必ず実行されているのがわかりますね。これは、データの保存忘れや通信の切断漏れを防ぐために非常に重要な役割を持っています。
3. finallyは何のために使うの?初心者向けに例えで説明
プログラミングにおけるfinallyの役割を、日常生活に例えると「後片付け」です。
たとえば、あなたがキッチンで料理をしている場面を想像してみてください。もし途中で「塩と砂糖を間違えた!」というミス(エラー)が起きても、あるいは「最高のオムレツができた!」と成功しても、最後に「ガスの元栓を閉める」「使った道具を洗う」という作業は、結果に関わらず必ず行いますよね?
プログラムも同じです。データの読み込み中にエラーが発生して処理が止まってしまったとしても、開いたままのファイルを閉じたり、ネットワークの接続を切断したりといった「後始末」を忘れると、コンピュータに負荷がかかり続けてしまいます。finallyは、そんな「何が起きても、これだけは絶対にやっておきたい作業」を確実に実行するための仕組みなのです。
ポイント:finallyブロックの中に書かれたコードは、エラー(例外)が発生してもしなくても、どちらの場合でも100%動作します。
では、実際に簡単なプログラムでその動きを確認してみましょう。
func makeCooking() {
print("料理を開始します。")
// try-catch (Swiftでは do-catch) の流れ
do {
// ここでエラーが起きる可能性がある処理を行う
print("冷蔵庫から卵を取り出します。")
// 例:卵がなかったらエラーが発生!
} catch {
print("エラー発生:卵がありませんでした。")
} finally {
// 成功しても失敗しても必ず実行される
print("キッチンの火を消して、後片付けをします。")
}
}
makeCooking()
このように記述することで、どんなトラブルが起きても「火を消し忘れる」といった最悪の事態を防ぐことができ、安全なプログラムを作ることができるようになります。
4. エラーが起きないとき(正常終了)でもfinallyは実行される
プログラミングをしていると、「エラーが起きたときだけ特別な処理をしたい」と考えがちですが、finallyの真価は「何があっても、最後にはこれだけはやっておきたい」という処理を確実に実行できる点にあります。
まずは、エラーが発生せずに計算がスムーズに終わる「正常系」のパターンで、finallyブロックがどのように動くのかを具体例で見てみましょう。初心者の方にも分かりやすいよう、シンプルな割り算のプログラムを用意しました。
fun main() {
try {
println("--- 処理を開始します ---")
val result = 10 / 2
println("計算結果: $result")
} catch (e: ArithmeticException) {
// このブロックはエラー(例外)が出たときだけ動きます
println("エラーが発生しました: ${e.message}")
} finally {
// エラーの有無に関わらず、最後に必ず動くブロックです
println("【完了報告】処理の最後に必ず実行されるfinallyブロックです")
}
println("--- 全てのプログラムが終了しました ---")
}
実行結果:
--- 処理を開始します ---
計算結果: 5
【完了報告】処理の最後に必ず実行されるfinallyブロックです
--- 全てのプログラムが終了しました ---
実行結果を見ると分かる通り、tryの中の計算が成功してcatch(エラー処理)を飛び越えた場合でも、その後のfinallyの中身は100%確実に実行されています。
これは例えば、「ファイルの読み込みを終えたら必ず閉じる」といった、後片付けの処理に非常に役立ちます。たとえプログラムが途中で成功しても失敗しても、finallyを書いておくことで「やりっぱなし」を防ぎ、安全でクリーンなコードを書くことができるのです。
5. finallyでよく使われる実用的な使い方
「エラーが起きても起きなくても、絶対にこの処理だけは通したい」という場面は、プログラミングにおいて頻繁に登場します。特にリソースの解放と呼ばれる作業では、finallyが欠かせません。
現実のプログラムでよくある具体的なケースを、初心者の方向けのイメージで紹介します:
- ファイルやデータベースの後片付け: 開いたファイルを閉じる、接続を終了するといった「後始末」を確実に行います。
- メモリの節約: 一時的に確保したメモリやリソースを解放し、コンピュータの動作が重くなるのを防ぎます。
- ログの記録: 成功・失敗に関わらず、「処理がここまで到達した」という記録(ログ)を必ず残します。
初心者向けの具体例:ファイルの読み込み
例えば、大事なノート(ファイル)を開いて中身を読むプログラムを考えてみましょう。読み込み中に「字が汚くて読めない(エラー)」となっても、ノートを出しっぱなしにせず、最後には必ず「本棚に戻す(クローズ)」必要があります。これを自動化するのがfinallyの役割です。
func processFile() {
print("1. ファイルを開きます。")
do {
// ここでエラーが発生したと仮定します
print("2. データを読み込みます...")
// throw SomeError.failed
} catch {
print("3. エラーが発生しました:\(error)")
} finally {
// 成功しても失敗しても、必ず実行される
print("4. 【重要】ファイルを安全に閉じ、後片付けを完了しました。")
}
}
processFile()
このようにfinallyを活用することで、予期せぬエラーでプログラムが止まってしまった際も、システムの「開けっ放し」を防ぎ、メモリ不足やデータ破損といった二次被害を未然に防ぐことができます。安定したアプリ開発において、非常に信頼性の高い仕組みと言えます。
6. returnやthrowがあってもfinallyは実行される
注意点として、tryブロックの中でreturn(戻り値)やthrow(例外を投げる)があっても、finallyはちゃんと実行されます。
次のコードを見てみましょう:
fun sample(): Int {
try {
println("処理中...")
return 100
} finally {
println("return前にfinallyが実行されます")
}
}
fun main() {
val result = sample()
println("結果: $result")
}
実行結果:
処理中...
return前にfinallyが実行されます
結果: 100
このように、returnで関数を抜ける前にも、finallyが先に実行されていることがわかります。
Kotlinを基礎からしっかり学びたい人や、 Java経験を活かしてモダンな言語にステップアップしたい人には、 定番の入門書がこちらです。
基礎からわかるKotlinをAmazonで見る※ Amazon広告リンク
7. Kotlinの例外処理でfinallyを上手に使うコツ
finallyはあくまで“後始末”専用に使いましょう。エラー処理の代わりに使ったり、例外の内容を変更したりするのは避けた方が安全です。
以下のような心がけがポイントです:
- catch:エラー処理
- finally:後片付け(常に実行)
このように役割を分けて使うと、プログラムがきれいで読みやすくなります。
【未経験OK】Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験する60分
「プログラミングを始めたい」を形にする。最新言語Kotlinで楽しむ、ものづくりの第一歩。
本講座は、プログラミング経験が全くない方のためのエントリー講座です。「コードを書くってどういうこと?」という基本から、世界中で使われている最新言語Kotlin(コトリン)を使って、実際にプログラムを動かすまでを体験します。難しい理屈よりも、まずは「自分の手で動かす楽しさ」を最短距離で実感していただきます。
具体的な体験内容と環境
【つくるもの】
簡単な言葉を入力すると自動で返答してくれる「対話型ミニプログラム」や、計算を自動化する「便利ツール」をゼロから作成します。黒い画面に自分の書いた文字が表示される瞬間は、最高の感動体験です。
【開発環境】
プロのエンジニアが実際に使っている開発ツールIntelliJ IDEA(インテリジェイ)をインストールします。ボタン一つで日本語化し、初心者でも迷わず操作できる「魔法の設定」を一緒に行います。
この60分で得られる3つの体験
プロと同じ道具を揃えることで、明日から一人でもプログラミングを続けられる環境が整います。
「変数」や「型」といった難しい言葉も、身近な例え話で解説。モヤモヤをゼロにします。
Kotlinは英語に近くて読みやすいのが特徴。自分でコードを読んで、間違いを見つけるコツも伝授します。
※本講座は、パソコン操作が不安な方でも安心して受講いただける完全マンツーマンです。あなたのペースに合わせて、一つずつ丁寧に進めていきます。
Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験