[Kotlin] try-catch構文 エラーが発生した時の対処方法を分かりやすく解説!

Kotlinは扱うことができないエラーを検知した時、「例外」というものが発生します。

 

Kotlinで「例外」が生じると、アプリケーションが落ちる原因となります。

 

そこで今回、どのような時に「例外」が発生するのか、どのように「例外」を防ぐのかをこのページで解説していきます。

 

是非、このページを最後まで読んで頂ければと思います。

 

このページで解説すること

 

1.例外が発生する例

 

2.エラー発生を防ぐ方法

 

1.例外が発生する例

Kotlinでプログラムを組んでいる時、「実行時例外」と呼ばれるエラーが発生したことはないでしょうか。

 

Kotlinは扱いきれないエラーを検知した時、「例外」というエラーが発生します。

 

例外というエラーをどのように防ぐかを見ていく前に、例外発生時、どのようなエラーが表示されるのか、エラー原因の特定の仕方、どのように対処するのかを詳しく見ていきましょう。

 

以下はString型をInt型に変換するサンプルプログラムとなっています。

 

fun main(args: Array<String>) {

 

val message: String = "こんにちは"

 

val a: Int = message.toInt()

 

println("number = ${a}")

 

}

 

サンプルプログラムを実行した結果は以下の通りになります。

 

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:3)

 

サンプルプログラムを実行すると長々とメッセージが表示されました。

 

上記のメッセージを要約すると「エラーが発生していますよ」という内容になっています。

 

Android StudioやTry Kotlinでプログラムを実行して、エラーが発生しても、ブラウザが落ちることはありませんが、アプリでこのようなエラーが発生するとアプリがクラッシュする原因となります。

 

そのため、エラーが発生した時、エラーが起きた原因をしっかりと把握することが重要となります。

 

それでは、どのようなエラーが起きているのか詳しく内容を見ていきましょう。

 

1行目ではどのような問題が発生しているのかが記載されています。

 

ここでは「NumberFormatException(数値書式例外)が生じています」と記載されています。

 

つまり、String型「こんにちは」をInt型「こんにちは」に変換できませんという意味です。

 

エラーが発生した時、どのようなエラーが発生しているのかだけではなく、どの部分でエラーが発生しているのかも教えてくれています。

 

どの部分でエラーが発生しているかは2行目以降に記載されています。

 

5行目の「Simplest version.kt:3」がどの部分でエラーが発生しているかを特定するメッセージとなっています。

 

これはサンプルプログラムの上から3行目で問題が生じているということを意味しています。

 

問題の箇所が分かったので、サンプルプログラムの3行目を見てみましょう。

 

3行目のコードは「val a: Int = message.toInt()」となっています。

 

3行目はString型のmessageという変数をInt型に変換するというコードになっております。

 

Int型は「-2147483647」から「2147483647」までの整数を扱う変数の型となっているので、「こんにちは」という文字列はInt型に変換できないということが推測できます。

 

このように、String型の「こんにちは」はInt型に変換できないというのがエラー原因だということが分かりました。

 

エラー原因が分かりましたので、String型の値を「10」という文字列に置き換えてサンプルプログラムを見ていきましょう。

 

fun main(args: Array<String>) {

 

val message: String = "10"

 

val a: Int = message.toInt()

 

println("number = ${a}")

 

}

 

表示結果は以下の通りになります。

 

10

 

上記のようにサンプルプログラムを直すと、エラーが解決しました。

 

今回は簡単なサンプルプログラムでのエラーをもとに解説してきましたが、どのようなエラーでも対処の仕方は基本的に同じになります。

 

 

2.エラー発生を防ぐ方法

上記のサンプルプログラムではエラー原因を突き止めて、エラーが発生しないようにサンプルプログラムを修正する方法を解説しました。

 

ありとあらゆることを想定してプログラムを組んでも、意図しないエラーが発生することもあります。

 

エラーが発生してアプリが落ちないようにするためにはどのように対処したらいいのでしょうか。

 

このような場合、try-catch構文を使用して対処します。

 

それではtry-catch構文を使用してサンプルプログラムを見ていきましょう。

 

fun main(args: Array<String>) {

 

 val message: String = "こんにちは"

 

 try {

 

  val a: Int = message.toInt()

 

  println("number = ${a}")

 

 } catch (e: NumberFormatException) {

 

  println("「${message}」はInt型に変換できません")

 

 }

 

}

 

表示結果は以下の通りになります。

 

「こんにちは」はInt型に変換できません

 

上記のようにtry-catch構文を使用することでエラーが生じることなく、「「こんにちは」はInt型に変換できません」と表示されました。

 

それではどのように処理されたのか詳しく見ていきましょう。

 

まず始めに、3行目から6行目のtry {}内のプログラムが実行され、例外が生じました。

 

例外が生じる原因は「1.例外が発生する例」で解説した通りです。

 

例外が生じたので、6行目から8行目のcatch{}内のプログラムが実行され、「「こんにちは」はInt型に変換できません」と表示されました。

 

このようにtry-catch構文を使用することで万が一、例外が発生した時に自分が設定したエラーメッセージを表示をさせることができます。

 

例えば、エラーが発生するかしないかに関わらず、メッセージを表示したい場合はどのようにしたらいいのでしょうか。

 

このような場合、finallyを使用します。

 

それではサンプルプログラムを見ていきましょう。

 

fun main(args: Array<String>) {

 

 val message: String = "こんにちは"

 

 try {

 

  val a: Int = message.toInt()

 

  println("number = ${a}")

 

 } catch (e: NumberFormatException) {

 

  println("「${message}」はInt型に変換できません")

 

 } finally {

 

  println("処理が終わりました")

 

 }

 

}

 

表示結果は以下の通りになります。

 

「こんにちは」はInt型に変換できません

 

処理が終わりました

 

このようにfinallyを使用することでどんなケースにもメッセージを表示させることができます。

 

 

ポイント

・プログラムで想定されていないエラーが生じるとアプリケーションが落ちる原因になります

 

・try-catch構文を使用することで想定しないエラーでアプリケーションが落ちるのを防ぐことができます

2020年03月30日