カテゴリ: Kotlin 更新日: 2025/12/09

Kotlinで例外の原因を追跡するcauseプロパティの使い方をやさしく解説!初心者でも安心

Kotlinで例外の原因を追跡するcauseプロパティの使い方
Kotlinで例外の原因を追跡するcauseプロパティの使い方

先生と生徒の会話形式で理解しよう

生徒

「Kotlinでエラーが出たときに、なぜそのエラーが起きたのか調べる方法ってあるんですか?」

先生

「とても良い視点ですね。Kotlinでは、エラー(例外)の原因をたどるためにcauseというプロパティを使うことができます。」

生徒

「それって、どうやって使うんですか?初心者にも分かるように教えてください!」

先生

「もちろんです。ひとつずつゆっくり説明していきましょう!」

1. Kotlinの例外とは?

1. Kotlinの例外とは?
1. Kotlinの例外とは?

Kotlin(コトリン)では、プログラムが思いがけない状況に遭遇すると「例外(れいがい)」というエラーを発生させます。例えば、「ゼロで割る」「存在しないファイルを読む」などがあると、プログラムが止まってしまうのです。

このときに発生するエラー情報のことを「例外オブジェクト」と呼びます。Kotlinではこの例外をtry-catchという仕組みでキャッチして、処理を続けることができます。

2. causeプロパティとは何か?

2. causeプロパティとは何か?
2. causeプロパティとは何か?

エラーには「直接の原因」と「さらにその原因」があることがあります。たとえば、「データベース接続に失敗」したとしても、実際の原因は「ネットワークが切れていた」など、さらに奥にあることも多いです。

そんなとき、KotlinではThrowableクラスのcauseプロパティを使うことで、「この例外は何が原因で発生したのか」を追跡することができます。

3. Kotlinでcauseを使った基本的な例

3. Kotlinでcauseを使った基本的な例
3. Kotlinでcauseを使った基本的な例

それでは、実際にcauseを使ってエラーの原因を追跡してみましょう。


fun main() {
    try {
        try {
            throw IllegalArgumentException("値が不正です")
        } catch (e: IllegalArgumentException) {
            throw RuntimeException("上位の処理で例外が発生しました", e)
        }
    } catch (e: RuntimeException) {
        println("例外メッセージ: ${e.message}")
        println("原因の例外: ${e.cause}")
    }
}

このプログラムでは、最初にIllegalArgumentExceptionという例外をわざと発生させています。それをRuntimeExceptionとして上位に投げ直しています。

e.causeとすることで、もともとのエラー「値が不正です」が何だったのかを確認することができます。

出力結果は次のようになります。


例外メッセージ: 上位の処理で例外が発生しました
原因の例外: java.lang.IllegalArgumentException: 値が不正です

4. 例外が連鎖するときの仕組み

4. 例外が連鎖するときの仕組み
4. 例外が連鎖するときの仕組み

プログラムでは、エラーが一つだけでなく、複数の層で発生している場合があります。このように、例外が例外を包み込むように発生していくことを「例外の連鎖」と呼びます。

Kotlinでは、例外を新しく作成する際に、引数としてcauseを指定することで、例外の連鎖を表現することができます。

例えば以下のように使います。


val original = IllegalStateException("元の問題")
val wrapped = RuntimeException("処理失敗", original)

このようにすることで、wrapped.causeoriginalの情報にアクセスできるようになります。

5. causeプロパティの実用例

5. causeプロパティの実用例
5. causeプロパティの実用例

例えば、アプリでユーザーがログインしようとしたときに失敗した場合、その裏にある本当の原因を知りたいことがあります。原因が「パスワードが間違っていた」のか、「サーバーに接続できなかった」のかによって対処方法が変わります。

ログイン処理を例にすると、以下のように記述できます。


fun login(userId: String, password: String) {
    try {
        authenticate(userId, password)
    } catch (e: Exception) {
        throw LoginFailedException("ログインに失敗しました", e)
    }
}

ここでLoginFailedExceptioncauseを見ることで、ログイン失敗の真の原因にたどり着くことができます。

6. KotlinのThrowableクラスとcauseの関係

6. KotlinのThrowableクラスとcauseの関係
6. KotlinのThrowableクラスとcauseの関係

Kotlinのすべての例外はThrowableというクラスを元に作られています。このThrowableクラスには、message(メッセージ)やcause(原因)などのプロパティが定義されています。

そのため、どんな例外であっても.causeを使うことができます。これはJavaの例外とも共通しています。

7. 例外情報を詳しく出力するprintStackTrace()

7. 例外情報を詳しく出力するprintStackTrace()
7. 例外情報を詳しく出力するprintStackTrace()

さらに詳しくエラーの状況を知りたい場合は、例外オブジェクトに対してprintStackTrace()を使うと、コンソールにスタックトレース(どこで何が起こったかの履歴)を表示できます。

これは、causeと一緒に使うと非常に強力です。以下のように使えます。


try {
    doSomething()
} catch (e: Exception) {
    e.printStackTrace()
    println("原因: ${e.cause}")
}

8. プログラミング初心者へのアドバイス

8. プログラミング初心者へのアドバイス
8. プログラミング初心者へのアドバイス

初めてプログラムを書くと、エラーにびっくりしてしまうことがあります。でも、causeのような仕組みを使えば、「なぜエラーが出たのか」をたどって理解することができます。

エラーの原因がわかれば、解決方法も自然と見えてきます。焦らずに、ひとつずつ追いかけてみましょう。

Kotlinを基礎からしっかり学びたい人や、 Java経験を活かしてモダンな言語にステップアップしたい人には、 定番の入門書がこちらです。

基礎からわかるKotlinをAmazonで見る

※ Amazon広告リンク

まとめ

まとめ
まとめ

Kotlinのcauseプロパティで例外の流れをていねいに理解しよう

ここまでの内容で、Kotlinの例外がどのように発生してどのように伝わっていくのか、そしてその流れを追跡するために使えるcauseプロパティの役割がかなりはっきりしてきたと思います。プログラムが動かなくなったときにただ「エラーが出た」と眺めるだけではなく、「どの処理で最初に問題が起きて」「どのような例外として包み直されて」「最終的にどこで捕まえられたのか」という流れを意識して読むことが、ことりんでの例外処理やデバッグの力を大きく育ててくれます。とくに初心者のうちは、画面に出てくるメッセージやスタックトレースをなんとなく眺めてしまいがちですが、causeプロパティを意識して例外の原因をたどる練習をしておくと、あとから実務で複雑なエラーに出会ったときにも落ち着いて対処できるようになります。

Kotlinでの例外オブジェクトはThrowableを土台として作られており、その中にmessageやcauseなどの情報が含まれています。原因となった例外を別の例外で包み直すときに、第二引数として渡したものがcauseに設定され、あとからe.causeとして参照できる、という流れを頭の中でイメージしておくと理解しやすくなります。原因がわかれば、エラーが出た場所だけでなく、本当に直すべき場所がどこなのかも見えやすくなります。データベースの接続であれば、接続文字列なのか、ネットワークなのか、認証情報なのか、ログイン処理であれば入力値なのか、外部サービスとの通信なのか、そういった切り分けの第一歩としてcauseはとても心強い道しるべになります。

シンプルなサンプルコードでcauseの流れを再確認

あらためて、例外を包み直しながらcauseプロパティで原因をたどる流れを、少しだけ別のサンプルコードで確認しておきましょう。ここでは小さな関数をいくつか用意して、だんだん上位の処理へ例外を伝えていく形にしています。


fun readConfig(): String {
    throw IllegalStateException("設定ファイルが見つかりません")
}

fun loadService(): String {
    return try {
        readConfig()
    } catch (e: IllegalStateException) {
        throw RuntimeException("サービスの起動に失敗しました", e)
    }
}

fun main() {
    try {
        loadService()
    } catch (e: RuntimeException) {
        println("最終的な例外: ${e.message}")
        println("原因となった例外: ${e.cause}")
    }
}

このコードでは、最初にreadConfig関数の中で設定ファイルに関する例外が発生し、それをloadService関数が受け取って別のメッセージを持つRuntimeExceptionとして投げ直しています。いちばん外側のmain関数では、RuntimeExceptionだけを捕まえていますが、messageだけでなくcauseを参照することで、「設定ファイルが見つかりません」という元の原因まできちんと把握できます。実際の開発では、ユーザーに見せるメッセージはやさしい日本語にして、ログにはcauseを含めた詳細な情報を残す、といった使い分けもよく行われます。

また、causeをたどるときには、printStackTraceと組み合わせてスタックトレースの流れを確認することも大切です。どのメソッドからどのメソッドへ処理が進み、その途中のどこで例外が発生したのかを階段のように遡って見ることができるため、ファイル名や行番号とあわせて、原因調査の精度がぐっと高まります。焦ってコード全体を書き換えるのではなく、「どこから」「なぜ」がおかしくなったのかを落ち着いて読み解く姿勢が、ことりんでの例外処理を上達させる近道です。

Kotlinの例外処理で意識しておきたい考え方

例外処理というと、「とりあえずtryで囲んでcatchしておけばよい」という考え方になってしまうこともありますが、Kotlinで質の高いコードを書こうとすると、どの層で例外を捕まえて、どの層までcauseをつないでおくか、という設計もとても重要になります。すべての例外を一番外側で一括して捕まえるだけでは、原因の文脈が分かりづらくなってしまいますし、逆に細かすぎる位置で例外をすべて処理してしまうと、呼び出し元へうまく情報が伝わらないこともあります。適度な粒度で例外を包み直し、そのときに原因となった例外をcauseとして必ず残しておく、という癖をつけると、あとから自分や他の開発者がコードを読むときにも理解しやすい構造になります。

さらに、エラーメッセージの文章もとても大切です。causeには元の例外がそのまま入るので、内部向けの詳細なメッセージを持たせておき、表側のRuntimeExceptionやアプリケーション固有の例外クラスには、ユーザーが読んでも意味が分かるやわらかい日本語を設定する、という設計がよく使われます。ことりんのコードの中で、「開発者向けの情報」と「利用者向けの情報」を分けて考えることで、ログは読みやすく、画面の表示も親切なものにできるわけです。その橋渡し役としてもcauseプロパティはとても役立つ存在だといえます。

初心者のうちは、例外クラスやcauseプロパティ、スタックトレースなど、専門用語が多くて少し身構えてしまうかもしれませんが、ひとつひとつの仕組みをゆっくり試しながら触ってみると、だんだんと「エラーはこわいものではなく、プログラムが自分にヒントをくれているものだ」という感覚に変わっていきます。小さなサンプルから始めて、自分で例外を発生させて、catchして、messageとcauseをprintlnで出力して眺めてみる、という練習を何度か繰り返すと、多くのことが自然と身についていきます。

そして、ことりんでの例外処理は、サーバーサイドのアプリケーションやスマートフォンアプリ、デスクトップアプリなど、さまざまな場面で共通して活かせる基礎になります。例外の原因を丁寧に追いかけられるようになると、「なぜクラッシュしたのか分からない」「たまたま動いたからよしとしてしまう」といった不安が減り、落ち着いてログを読み解きながらプログラムと向き合えるようになります。今回学んだcauseプロパティをきっかけに、try-catchや例外クラスの設計、ログの残し方なども少しずつ広げていくと、ことりんの学習全体がより楽しく、実用的なものになっていくでしょう。

先生と生徒の振り返り会話

生徒

「きょうは、Kotlinでcauseプロパティを使って例外の原因をたどる方法を学びましたけれど、前よりもエラーの読み方が分かった気がします。前は数字や英語のメッセージを見てあきらめていたんですが、今はどこに注目すればよいか見えてきました。」

先生

「とてもよい気づきですね。例外メッセージだけを見るのではなく、causeにどんな例外が入っているのか、スタックトレースのどの行で最初の問題が起きているのかを意識するだけで、デバッグの精度は大きく変わります。今回のように小さなサンプルで練習しておくと、本番のアプリでも落ち着いて対応できるようになりますよ。」

生徒

「最初に別の例外が発生して、それを包み直して上の層に投げる、という流れもだいぶイメージできました。同じエラーでも、ユーザーに見せる文章と、開発者がログで見る詳細な情報を分けて考える、という考え方もおもしろいですね。」

先生

「その通りです。ログイン処理やファイル読み込み、ネットワーク通信など、実際の処理ではいろいろな原因で失敗が起こりえます。そのたびに、表向きの例外には分かりやすいメッセージを、causeには元の例外を、スタックトレースには詳細な流れを、というふうに情報を整理しておくと、あとから見返したときにとても助かります。」

生徒

「これからは、ただtryとcatchで囲むだけではなくて、どの階層で例外を捕まえて、どこまでcauseをつないでおくかも意識してコードを書いてみます。小さなサンプルをたくさん作って、いろいろなパターンのエラーを試してみたいです。」

先生

「すばらしいですね。自分で例外を発生させて、causeやprintStackTraceの出力を一行ずつ眺めてみると、新しい発見がたくさんあります。今回学んだことを土台にして、ことりんのエラーハンドリングやデバッグの力を少しずつ育てていきましょう。」

関連セミナーのご案内

【未経験OK】Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験する60分

「プログラミングを始めたい」を形にする。最新言語Kotlinで楽しむ、ものづくりの第一歩。

本講座は、プログラミング経験が全くない方のためのエントリー講座です。「コードを書くってどういうこと?」という基本から、世界中で使われている最新言語Kotlin(コトリン)を使って、実際にプログラムを動かすまでを体験します。難しい理屈よりも、まずは「自分の手で動かす楽しさ」を最短距離で実感していただきます。

具体的な体験内容と環境

【つくるもの】
簡単な言葉を入力すると自動で返答してくれる「対話型ミニプログラム」や、計算を自動化する「便利ツール」をゼロから作成します。黒い画面に自分の書いた文字が表示される瞬間は、最高の感動体験です。

【開発環境】
プロのエンジニアが実際に使っている開発ツールIntelliJ IDEA(インテリジェイ)をインストールします。ボタン一つで日本語化し、初心者でも迷わず操作できる「魔法の設定」を一緒に行います。

この60分で得られる3つの体験

1. 自分のパソコンが「開発基地」に

プロと同じ道具を揃えることで、明日から一人でもプログラミングを続けられる環境が整います。

2. プログラミングの「仕組み」がスッキリ

「変数」や「型」といった難しい言葉も、身近な例え話で解説。モヤモヤをゼロにします。

3. 「読みやすい」から「直せる」へ

Kotlinは英語に近くて読みやすいのが特徴。自分でコードを読んで、間違いを見つけるコツも伝授します。

※本講座は、パソコン操作が不安な方でも安心して受講いただける完全マンツーマンです。あなたのペースに合わせて、一つずつ丁寧に進めていきます。

セミナー画像

Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験

カテゴリの一覧へ
新着記事
New1
Go言語
Go言語のwhile的なforループの使い方!条件式ループの基本を解説
New2
Go言語
Go言語プログラムの実行方法まとめ!VSCode・ターミナルでの実行手順を解説
New3
Swift
Swift意味とは?プログラミング言語・金融・鳥の違いを徹底解説
New4
Swift
Swift 戻り値の扱い方と複数戻り値の返し方|初心者でも分かる関数の基本
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語でリダイレクト処理を行う方法(http.Redirect)を初心者向けに解説
No.2
Java&Spring記事人気No2
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.3
Java&Spring記事人気No3
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.4
Java&Spring記事人気No4
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.5
Java&Spring記事人気No5
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方
No.6
Java&Spring記事人気No6
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.7
Java&Spring記事人気No7
Go言語
Go言語で条件式を1行で書くコツ!三項演算子の代替と短縮記法
No.8
Java&Spring記事人気No8
Kotlin
Kotlinのログ出力方法を完全ガイド!LogcatとTimberでトラブルシューティング