Android
 Computer >> コンピューター >  >> プログラミング >> Android

Kotlinでカスタム例外を定義してスローする方法【サンプルコード付き】

例外(Exception)処理は、あらゆるプログラミング言語において重要な要素です。適切な例外処理を行うことで、実行時にプログラムが誤った出力を生成したり、予期せずクラッシュしたりするのを防ぐことができます。

Kotlinの例外の仕組みはJavaと非常によく似ています。Kotlinのすべての例外はThrowableクラスの子孫であり、さらに開発者は独自のカスタム例外を自由に定義することもできます。

カスタム例外は非検査例外(Unchecked Exception)に分類され、コンパイル時ではなく実行時にスローされます。

Kotlinでカスタム例外を作成する方法を詳しく見ていく前に、まず「検査例外」と「非検査例外」の違いを確認しておきましょう。

検査例外(Checked Exception)とは

検査例外とは、コンパイル時にチェックされる例外のことです。代表的な例としては、FileNotFoundExceptionIOException が挙げられます。

次の例では、存在しないファイルを開こうとしているため、FileNotFoundException が発生します。

サンプルコード

import java.io.File
import java.io.InputStream

fun main(args: Array<String>) {
   try {
      val inputStream: InputStream = File("Hello.txt").inputStream()
   }
   catch(e:Exception) {
      e.printStackTrace()
   }
}

実行結果

上記のコードを実行すると、次のような出力が得られます。ファイルが存在しないため、FileNotFoundException(検査例外の一種)が出力されているのがわかります。

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar
java.io.FileNotFoundException: Hello.txt (No such file or directory)
   at java.io.FileInputStream.open0(Native Method)
   at java.io.FileInputStream.open(FileInputStream.java:195)
   at java.io.FileInputStream.<init>(FileInputStream.java:138)
   at MainKt.main(main.kt:6)

なお、KotlinではJavaと異なり、メソッドシグネチャでの例外宣言(throws句)が強制されません。そのため、検査例外に分類される例外であっても、明示的に宣言しなくてもコンパイルエラーにはならない点に注意してください。

非検査例外(Unchecked Exception)とは

非検査例外とは、コンパイル時にはチェックされず、実行時にスローされる例外のことです。ArithmeticExceptionNumberFormatException などがその代表例です。

次の例では、数値に変換できない文字列に対して toInt() を呼び出しているため、NumberFormatException が発生します。

サンプルコード

fun main(args: Array<String>) {
   try {
      val myVar:Int = 12
      val v:String = "Tutorialspoint.com"
      v.toInt()
   }
   catch(e:Exception) {
      e.printStackTrace()
   }
   finally {
      println("Exception Handling in Kotlin")
   }
}

実行結果

上記のコードを実行すると、finally ブロックのメッセージが表示された後、NumberFormatException のスタックトレースが出力されます。

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar
Exception Handling in Kotlin
java.lang.NumberFormatException: For input string: "Tutorialspoint.com"
   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 MainKt.main(main.kt:5)

Kotlinでカスタム例外を作成・スローする

それでは、シンプルな例を使って独自のカスタム例外を作成してみましょう。この例では、変数を宣言し、その値が50より大きいかどうかを判定します。条件を満たす場合は、Kotlinの組み込み機能を利用してカスタム例外をスローします。

サンプルコード

fun main(args: Array<String>) {
    val sampleNumber:Int
    sampleNumber = 100
    if(sampleNumber > 50) {
        // 検査例外の代わりにカスタム例外をスローする
        throw myCustomException("Invalid Inputs - Please enter a correct number")
    } else {
        println("Welcome !! you have entered a correct value")
    }
}

// カスタム例外クラスの定義
class myCustomException(message: String) : Exception(message)

実行結果

このコードを実行すると、次のような出力が得られます。コンストラクタに渡したメッセージとともに、独自に定義したカスタム例外がスローされていることが確認できます。

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar

Exception in thread "main" myCustomException: Invalid Inputs -
Please enter a correct number
at MainKt.main(main.kt:7)

カスタム例外を実装する際のポイント

カスタム例外を効果的に活用するためのポイントを整理しておきます。

  • Exceptionクラスを継承する: class myCustomException(message: String) : Exception(message) のように親クラスへメッセージを渡すことで、標準的な例外と同じように扱えます。
  • 意味のあるメッセージを渡す: エラーの原因や対処法がわかるメッセージを設定すると、デバッグが格段にしやすくなります。
  • 内容がわかるクラス名を付ける: InvalidInputException のように、例外の種類が一目でわかる名前を付けるとコードの可読性が向上します。

このように、Kotlinでは Exception クラス(またはそのサブクラス)を継承するだけで、簡単に独自の例外クラスを定義できます。アプリケーション固有のエラー状態を明確に表現したい場合に、カスタム例外は非常に有効な手段となるでしょう。

  1. Javaでカスタム例外を作成する方法をわかりやすく解説

    アプリケーションの要件によっては、標準の例外だけでは不十分な場合があり、より意味のある独自の例外を定義したい場面があります。Javaでは、Exceptionクラスを継承することで、自分専用の例外クラス(カスタム例外)を簡単に作成できます。このように開発者が独自に定義した例外は「ユーザー定義例外」と呼ばれ、一般的にカスタム例外(Custom Exception)という名称でも知られています。カスタム例外を作成する手順CustomExceptionクラスはカスタム例外クラスであり、Exceptionクラスを継承して定義します。例外メッセージを保持するためのローカル変数 message をクラス内に

  2. Rubyでカスタム例外を作成する方法【初心者向けガイド】

    Rubyでは、独自の例外クラスを簡単に作成できます。この記事では、カスタム例外を作るための基本的な手順を、コード例とともにわかりやすく解説します。 1. 新しいクラスを作成する Rubyにおいて、例外も他のオブジェクトと同じくクラスとして定義されています。新しい種類の例外を作りたい場合は、StandardError、あるいはそのサブクラスを継承したクラスを定義するだけでOKです。 class MyError < StandardError end raise MyError 慣例として、新しく作る例外クラスの名前は「Error」で終わるように命名します。また、カスタム例外をモジュ