【第24章】例外とtry-catch文について詳しく解説

【第24章】例外とtry-catch文について詳しく解説 基礎勉強
スポンサーリンク
リンコ
リンコ

こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、Kotlinでの例外とtry-catch文について解説するピヨ!

この第24章では、プログラミング言語であるKotlinの例外とtry-catch文について、一緒に勉強していきましょう。

この記事を読めばプログラミング未経験の方も、Kotlin入門レベルの例外とtry-catch文について1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。

※この記事で出てくる「サンプルコード」は、記述が長く画面からはみ出ている場合がありますが、横にスライドすると表示されるのでご安心ください。

スポンサーリンク

【Kotlin】例外とは?

例外とは?

まず、そもそも例外とは何かを一緒に勉強していきましょう。例外は、エラーが発生した時の動きのことを言います。

変数の型変換で「実行時例外」と呼ばれるエラーが発生するケースに少し触れましたが、処理を実行中にKotlinが扱いきれないエラーを検知した時に「例外」というものが発生します。

わかりやすい例で言うと、スマホゲームやアプリで遊んでいる時に、急にフリーズしたりアプリが落ちた時はこの「例外」が発生した時です。

この章では、この例外がKotlinでどのような場合に起こるのかや、エラーが起きた際の原因の追究方法、そもそも例外が落ちないようにする方法などを学んでいきます。

リンコ
リンコ

アプリやゲームがフリーズしたり落ちたりした時「例外」が起きているピヨ!

【Kotlin】例外が起きる場合の例

例外が起きる場合の例

例外がどういう意味なのか理解したところで、例外が起きる場合の例を勉強していきます。

変数の型変換をした時

以下の例のように、String型の文字列が入った変数をInt型にして変数に代入しようとすると例外が発生します。

fun main() {
  val name = "リンコです!"
  val num = name.toInt() //ここで例外が発生します
  println("name = ${name}")
}

上記を実行すると、コンソール下部にエラー文字が流れますが、これを「例外のスタックトレース」と呼びます。

このような例外を起こしてしまうと、アプリが落ちたりフリーズしてユーザーがイライラしてしまいます。

そうすると、グーグルプレイなどで評価1をつけられてしまう可能性があるので注意しましょう。

【Kotlin】エラーが起きた際の原因追及方法

エラーが起きた際の原因追及方法

どんな時にエラーが起こってしまうのかわかりましたね!続いて、エラーが起きた際の原因の追究方法を勉強していきます。

例外のスタックトレースを確認する

エラーが起きた場合は、まずエラーが起きた原因を知ることが重要になります。

理由を分析するのに重要な情報は「例外のスタックトレース」の中に記述されているので、そちらを確認しましょう。

ぱっと見るとよくわからないですが、見るのを避けずに必ず見て確認することで、原因を追究することができます。

スタックトレースの見方

肝心のスタックトレースの見方ですが、まず一番上の行には問題が何なのかが記述されています。

2行目以降には、どこで問題が起きているのかが記述されていて、時系列が下から上の順になっているので、下から確認していくようにしましょう。

下から見ていき、例えば「at TestKt.main(Test.kt:3)」というようなエラー文が表示されていたとします。

これは「TestKt」というファイルの、main関数内でエラーが起きているということになります。また「(Test.kt:3)」と記述されていることから、3行目でエラーが起きていることがわかります。

このようにスタックトレースを見ていくことで、エラーが起きた原因が追究できるので、よくわからないエラーメッセージがたくさん出力されたからといって、諦めないようにしましょう。

リンコ
リンコ

どこで例外が起きたかは「例外のスタックトレース」を見ればわかるピヨ!

【Kotlin】try-catch文とは?

try-catch文とは?

Kotlinの例外について勉強したところで、続いてtry-catch文について勉強していきます。ではまず、try-catch文とはなんなのか学んでいきましょう。

例外が起きてもアプリが落ちないようにする方法

try-catch文は、簡単に説明すると「例外が起きてもアプリが落ちないようにする方法」です。

try-catch文を使うことで、例えば例外が起きた時に「その操作はできません」などのようなメッセージを表示させて、アプリが落ちないようにすることができます。

このように、例外が起きてもアプリが落ちずにユーザーをイライラさせることをなくすのが、try-catch文です。

エラーは複数種類あるので全て防ぐ必要がある

try-catch文を使うことで、例外が起きてもアプリが落ちないようにできますが、ただしエラーメッセージ単位で防がないといけないので、出力される可能性のあるエラーは全て防ぐ必要があります。

後程詳しく説明しますが、複数のエラーを防ぐには「catch節」をいくつも記述することで、複数のエラーを防ぐことができます。

リンコ
リンコ

try-catch文は例外が起きるのを防ぐ方法ピヨ!

【Kotlin】try-catch文を使った例

try-catch文を使った例

ではtry-catch文がどういう記述なのか、例を見ていきましょう。

try-catch文の書式

以下が、try-catch文の書式になります。

try {
処理内容
} catch (例外の文) {
上記の例外が出力された際の処理内容
}

try{}で処理内容を囲う

try-catch文は、まずエラーが起こりうる処理内容を「try{}」で囲います。

catch () の「()」内にエラーメッセージを記述

「try{}」の後に「catch ()」と記述し、この「()」内に起こりうるエラーのメッセージを記述します。

その後の「{}」内には、エラーメッセージが出力された際に、表示させたい内容を記述します。

そうすることで、実際にエラーが起きた時にアプリが落ちず、代わりにメッセージなどを出力することができます。

try-catch文を使った例

実際にtry-catch文を使ってみましょう。

サンプルコード

以下のサンプルコードでは、文字列の入った変数nameをString型からInt型の変数numに型変換しようとしています。

nameの中身はString型なので例外が起きるのですが、try-catch文を使っているのでどのように出力されるのか見てみましょう。

fun main() {
  val name = "リンコです!"
  try {
    val num = name.toInt() //ここで例外が発生します
    println("num = ${num}")
  } catch (e: NumberFormatException) {
    println("「${name}」という文字列は数値に変換できません。")
  }
}

出力

サンプルコードを実行すると、以下のように出力されます。

「リンコです!」という文字列は数値に変換できません。

実行すると本来は例外のエラーが発生しますが、このように「例外のスタックトレース」は表示されなくなりました。

その代わり「「リンコです!」という文字列は数値に変換できません。」と表示されています。

この例では「name.toInt()」の時点で「NumberFormatException」が起こっています。そうすると次の処理部分の「println(“num = ${num}”)」が実行されなくなります。

その代わり「catch (e: NumberFormatException) {」の部分が動き、そのcatchブロック内の「println」が実行され、文字列が表示されることになります。

これで例外が起きてアプリが落ちることはなくなりました。

【Kotlin】catch節はいくつでも記述できる

catch節はいくつでも記述できる

ここまでで、例外が起きても問題なく処理できるようになりました。ですが、複数のエラーが起きる場合はどうしたらいいでしょうか?

Kotlinでは、catch節をいくつでも記述できるため、複数のエラーも防ぐことができます。

catch節を複数記述する場合の書式

以下が、catch節を複数記述する場合の書式になります。

try {
    処理内容
  } catch (例外の文1) {
    上記の例外が出力された際の処理内容
  } catch (例外の文2) {
    上記の例外が出力された際の処理内容
  } catch (例外の文3) {
    上記の例外が出力された際の処理内容
  }
}

このように、繰り返し「catch(){}」を記述することで複数のエラーを防ぐことができます。

複数のcatch節を使った例

実際に複数のcatch節を使ったtry-catch文を記述してみましょう。

サンプルコード

以下のサンプルコードは、先程と同じ内容ですが適当にcatch節を3つに増やしています。

fun main() {
  val name = "リンコです!"
  try {
    val num = name.toInt() //ここで例外が発生します
    println("num = ${num}")
  } catch (e: ArrayIndexOutOfBoundsException) {
    println("文字を入力してください")
  } catch (e: NumberFormatException) {
    println("「${name}」という文字列は数値に変換できません。")
  } catch (e: Exception) {
    println("想定外の何かが発生しました")
  } 
}

出力

サンプルコードを実行すると、以下のように出力されます。

「リンコです!」という文字列は数値に変換できません。

一番下の「Exception」は全ての例外の「基底クラス」になります。※すべての例外の「親玉」みたいなもの

上の2つ以外の例外が発生した場合に「想定外の何かが発生しました」と表示されるようになっています。

リンコ
リンコ

複数のcatch節で複数の例外を防ぐピヨ!

【Kotlin】例外が発生しても処理がスキップされないようにするには?

例外が発生しても処理がスキップされないようにするには?

また例外が発生した場合、その直後にあるprintlnなどの処理はスキップされてしまいます。

これをスキップされないで、例外が発生してもしなくても絶対に処理を実行したい場合は「finally節」を付け加えて、その中に処理を記述するようにします。

サンプルコード

以下のサンプルコードでは、最後に「finally節」を付け加えて、例外に関わらず必ず「申し訳ありません」と表示するようにしています。

fun main() {
  val name = "リンコです!"
  try {
    val num = name.toInt() //ここで例外が発生します
    println("num = ${num}")
  } catch (e: ArrayIndexOutOfBoundsException) {
    println("文字を入力してください")
  } catch (e: NumberFormatException) {
    println("「${name}」という文字列は数値に変換できません。")
  } catch (e: Exception) {
    println("想定外の何かが発生しました")
  } finally {
    println("申し訳ありません")
  }
}

出力

サンプルコードを実行すると、以下のように出力されます。

「リンコです!」という文字列は数値に変換できません。
申し訳ありません

このように、try-catch文の一番最後に記述している「finally節」の中のコードは、例外に関わらず必ず実行され表示されます。

リンコ
リンコ

finally節を使うと必ず処理が実行されるピヨ!

まとめ

まとめ

この記事では、プログラミング言語であるKotlinの例外とtry-catch文について勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。

  • 処理を実行中にKotlinが扱いきれないエラーを検知した時に「例外」というものが発生する
  • アプリで遊んでいて固まったり落ちたりしたときは「例外」が発生している
  • 「例外のスタックトレース」を見ると、どこで例外が起きたかわかる
  • try-catch文を使うと例外が起きてもアプリが落ちないようにできる
  • 複数の例外を防ぐにはcatch節を複数記述する
  • 例外に関わらず必ず処理を実行したい場合はfinally節を使う

今回勉強した「例外」や「try-catch文」はKotlinの入門レベルの知識になるので、何回も読み直してしっかり覚えておきましょう。

リンコ
リンコ

次回の記事では「null許容型の変数」について勉強していくピヨ!

プログラミング未経験の方や入門レベルの方、Kotlinについて詳しくなりたい方は、また一緒に勉強するピヨ!

コメント

タイトルとURLをコピーしました