こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、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文とは?
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{}で処理内容を囲う
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節はいくつでも記述できる
ここまでで、例外が起きても問題なく処理できるようになりました。ですが、複数のエラーが起きる場合はどうしたらいいでしょうか?
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について詳しくなりたい方は、また一緒に勉強するピヨ!
コメント