【Kotlin/Android】エラークラスThrowableとExceptionの違いと使い方
この記事からわかること
- Android Studio/Kotlinでエラークラスの違いと使い方
- ThrowableとExceptionとは?
- RuntimeExceptionやErrorとの使い分け
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Kotlinのエラー(例外)クラス
Kotlinで定義されているエラー(例外)に関するクラスは大きく分けてThrowable、Exception、Errorの3種類があります。なんだかたくさんあってややこしいですが、ThrowableがKotlin(Java)の全てのエラークラスの基底(スーパー)クラスとなります。
つまり階層構造にすると以下のようにThrowableのサブクラスとしてExceptionとErrorがありさらにそのサブクラスにさまざまなエラーが定義されています。
├── Throwable
│ ├── Error
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ └── etc...
│ ├── Exception
│ ├── IOException
│ ├── RuntimeException
│ ├── NullPointerException
│ ├── IndexOutOfBoundsException
│ └── etc...
│ └── etc...
Throwableクラス
Throwableクラスは全てのエラークラスの基底(スーパー)クラスで、messageやstackTraceなどをエラー情報に欠かせないプロパティを保持しています。つまり発生するエラーや例外クラスはThrowableを継承していることになります。
Throwableを投げるにはthrowの後にインスタンス化します。
fun throwsThrowable() {
throw Throwable("エラーが発生しました。")
}
エラーが発生するメソッドはtry〜catch文で補足することができます。
try {
throwsThrowable()
} catch (t: Throwable) {
Log.d("RxJava", "${t.message}")
}
ExceptionとErrorの違い
Throwableは基底クラスということがわかりましたがそのサブクラスであるException、Errorの違いはなんでしょうか?リファレンスを見てみると以下のように記述されていました。
Exception(例外):通常のアプリケーションでキャッチされる可能性のある問題
Error(エラー):通常のアプリケーションであればキャッチすべきではない重大な問題
どうやらエラーの重大さが異なるようです。つまりアプリ内でキャッチしてハンドリングするようなエラーはException、アプリをクラッシュさせるべきような致命的なエラーはErrorとして定義されている感じですかね。
Exceptionクラス
Exceptionはプログラム内でエラーハンドリングを行うような例外を定義するクラスでした。ExceptionはさらにRuntimeExceptionを継承しているものとそうでないものに分かれます。これは「チェック例外」と「非チェック例外」と呼ばれているようです。メソッドにthrows節がついているものがチェック例外となりtry〜catch文での補足が必須になり、補足していない場合コンパイルエラーになるようですが、Kotlinではコンパイルエラーにはならないようです。
├── Throwable
│ ├── Exception
│ ├── IOException
│ ├── SQLException
│ ├── ClassNotFoundException
│ ├── RuntimeException
│ ├── NullPointerException
│ ├── IndexOutOfBoundsException
│ └── etc...
│ └── etc...
独自のエラーを定義したい場合はExceptionクラスを拡張するのが良さそうです。例えば以下のような感じでしょうか?
// APIエラーの基底クラス
open class ApiException(message: String? = null, cause: Throwable? = null) : Exception(message, cause)
// 通信エラー
class NetworkException(message: String? = null, cause: Throwable? = null) : ApiException(message, cause)
// サーバーエラー
class ServerException(message: String? = null, cause: Throwable? = null) : ApiException(message, cause)
// 認証エラー
class AuthenticationException(message: String? = null, cause: Throwable? = null) : ApiException(message, cause)
// その他の予期せぬエラー
class UnexpectedException(message: String? = null, cause: Throwable? = null) : ApiException(message, cause)
Errorクラス
Errorは基本的に致命的なエラーを定義するクラスでした。定義されているものもメモリ消費が激しい場合や呼び出しスタックがオーバーフローした場合などになります。
├── Throwable
│ ├── Error
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ ├── AssertionError
│ └── etc...
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。






