クマの手も借りたい
馬とテニスとリラックマが好きな IT 系のエンジニアです。
Kotlin

【Kotlin入門】例外処理のハンドリング(try,catch)

Java や PHP でもお馴染みですが、Kotlin にも例外処理をハンドリングする仕組みがあります。

構文も同じく try, catch を使います。

今回は Kotlin で例外処理のポイントを紹介していきます。

アプリは致命的なエラーを見せたくない

アプリを使っていて致命的なエラーがでて落ちてしまったり、操作がやり直しになると萎えますよね・・・。

自分の操作ミスやエラーの原因がハッキリしているならまだしも、よくわからないまま時間がとられるのは勘弁です。

しかし明日は我が身・・・

デバッグ中やテスト中に例外エラーが発生するのは全然問題ありません。

私もいまでも頻繁に見かけます。特に慣れていない言語を扱う時はそいつらと格闘してます(笑)

よって、予期せぬ値が入ってくる可能性がある場合や、情報不備の場合に正常な結果に変換できないなど、想定しやすい部分から例外の設計をしていくことをオススメします。

例外発生のプログラム

では、実際にサンプルを書いてみます。

val s: String = "リラックマ"
val i: Int = s.toInt()

数値の文字列を数値型に変換しようと思いつつ、血迷って「リラックマ」を設定してしまったパターンです。

以下のような例外エラーが発生します。

Exception in thread “main” java.lang.NumberFormatException: For input string: “リラックマ”
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at Simplest_versionKt.main(Simplest version.kt:4)

例外の大きな原因は「NumberFormatException」が発生したことになります。

「リラックマ」という文字列を数値になんて変換できないよ。どうにもならないって時に出力されるエラーです。

リラックマは想定外

このサンプルは数値の文字列を持たせるところに「リラックマ」を入れ込んでしまいました。

リラックマやコリラックマならともかく、例外エラーは全然可愛くありません。

よって、当初の目的である数値に書き換えます。リラックマは今年で 15 周年なので 15 にしましょう。

val s: String = "15"
val i: Int = s.toInt()
println(i)

今度はプログラムが落ちずに結果が表示されました。

15

例外をハンドリングする

今回は「リラックマ」を「15」に修正しましたが、場合によってはまたしても「コリラックマ」や「キイロイトリ」が入ってしまうことも想定されます。

「こぐまちゃん」や「カオルさん」の可能性もあります。

よって万が一、数値ではない文字列が入った場合に例外エラーを出力するのではなく、例外をキャッチしてその後の処理をハンドリングしてあげましょう。

try {
    val s: String = "コリラックマ"
    val i: Int = s.toInt()
    println(i)
} catch (e: Exception) {
    println("数値に変換できない文字列が設定されています")
}

これで、変数 s に数値に置き換えれない文字列が設定された場合は Exception が発生し、catch の構文へ処理が移動します。

今回は Exception で大きくまとめましたが、実際には先ほどのように「NumberFormatException」を想定しておくこともできます。

catch (e: NumberFormatException) {
    println("数値に変換できない文字列が設定されています")
}

もちろん、NumberFormatException 以外の例外も考えられますしね。

throwで呼び出し元に託す

呼び出し元へ例外処理を移譲してしまう時は throw を使えば問題ありません。

fun main(args: Array) {
    try {
        val s: String = "キイロイトリ"
        val i: Int = convertNumber(s)
        println(i)
    } catch (e: Exception) {
        println("数値に変換できない文字列が設定されています")
    }
}

fun convertNumber(s: String): Int {
    try {
        val i: Int = s.toInt()
        return i
    } catch (e: Exception) {
        throw e
    }
}

ちなみに、throw された e の内容を確認してみると以下のようなエラーメッセージが保持されています。

try {
    val s: String = "キイロイトリ"
    val i: Int = sample(s)
    println(i)
} catch (e: Exception) {
    println(e.message)
}

実行してみます。

For input string: “キイロイトリ”

まとめ

例外処理は正常系の流れだけで考えるとイレギュラケースになるかもしれませんが、予期せぬ事態は発生します。

致命的なエラーが操作する人に見えてしまうと印象が悪くないので、エラーをハンドリングして想定されるメッセージを表示させてあげられるといいですね。

やさしいKotlin入門

プログラミング初心者または Kotlin 初心者向けの入門本。Android 開発ではなく Kotlin の言語を覚えてみたい方にオススメの入門本です。

Java と比較して説明される書籍が多い中、Java や他のプログラム言語を知らない人向けになるので、例えば Java はあまり詳しくないけど PHP や Python は書けるといったパターンとも相性がいいですよ。

created by Rinker
¥2,592
(2018/09/20 12:37:29時点 Amazon調べ-詳細)

あなたにオススメ