【Kotlin/Android】エラークラスThrowableとExceptionの違いと使い方

この記事からわかること

  • Android Studio/Kotlinエラークラス違い使い方
  • ThrowableExceptionとは?
  • RuntimeExceptionErrorとの使い分け

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

Kotlinのエラー(例外)クラス

Kotlinで定義されているエラー(例外)に関するクラスは大きく分けてThrowableExceptionErrorの3種類があります。なんだかたくさんあってややこしいですが、ThrowableKotlin(Java)の全てのエラークラスの基底(スーパー)クラスとなります。

つまり階層構造にすると以下のようにThrowableのサブクラスとしてExceptionErrorがありさらにそのサブクラスにさまざまなエラーが定義されています。

├── Throwable
│     ├── Error
│              ├── OutOfMemoryError
│              ├── StackOverflowError
│              └── etc...
│     ├── Exception
│              ├── IOException
│              ├── RuntimeException
│                       ├── NullPointerException
│                       ├── IndexOutOfBoundsException
│                       └── etc...
│              └── etc...

Throwableクラス

公式リファレンス:Throwableクラス

Throwableクラスは全てのエラークラスの基底(スーパー)クラスで、messagestackTraceなどをエラー情報に欠かせないプロパティを保持しています。つまり発生するエラーや例外クラスはThrowableを継承していることになります。

Throwableを投げるにはthrowの後にインスタンス化します。

fun throwsThrowable() {
    throw Throwable("エラーが発生しました。")
}

エラーが発生するメソッドはtry〜catch文で補足することができます。

try {
    throwsThrowable()
} catch (t: Throwable) {
    Log.d("RxJava", "${t.message}")
}

ExceptionとErrorの違い

Throwableは基底クラスということがわかりましたがそのサブクラスであるExceptionErrorの違いはなんでしょうか?リファレンスを見てみると以下のように記述されていました。

Exception(例外):通常のアプリケーションでキャッチされる可能性のある問題

公式リファレンス:Exceptionクラス

Error(エラー):通常のアプリケーションであればキャッチすべきではない重大な問題

公式リファレンス: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...

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index