【Java】例外処理について

f:id:hira98:20190529091812p:plain

【結論】

  • Javaでは例外もクラスとして扱われる。

  • 例外クラスはErrorExceptionRuntimeExceptionの3つに分類されている。

  • Exceptionクラスの例外が発生する可能性のあるメソッドは、呼び元で例外処理を実装しないとコンパイルエラーになる。

  • javaでの例外処理はtry-catch-finally文で実装する。

  • 例外処理を例外が発生したメソッドではなく、呼び元に丸投げする場合はthrows文を使う。

  • throw文を使うことで、任意のタイミングで例外を投げれる。

  • Exceptionクラスを継承することで、オリジナルの例外クラスを実装できる。

【目次】

例外処理とは?

読んで字のごとく、例外が起きた時に行う処理のことです。

お堅い説明はウィキペディアにお任せします。

例外処理(れいがいしょり)とは、プログラム)の上位の処理から呼び出されている下位の処理で継続不能、または継続すれば支障をきたす異常事態に陥ったとき、制御を呼び出し元の上位の処理に返し安全な状態になるよう回復処理をすること。その際に発生した異常のことを例外と呼ぶ。

引用:ウィキペディア

例外クラスの種類

Javaでは例外もクラスとして扱っており、下図のような継承関係になっています。

f:id:hira98:20190529091847p:plain

引用:Qitta 例外

エラークラスの説明と代表的なエラーは次の通りです。

  • Error:回復の見込みがない致命的な状況を表すクラス
    • OutOfMemoryError(メモリ不足)
    • ClassFormatError(クラスファイルが壊れている)
    • ...etc
  • Exception:発生を十分に想定して対処を考える必要がある例外的状況を表すクラス
    • IOException(ファイルなどが読み書きできない)
    • ConnectException(ネットワークに接続できない)
    • ...etc
  • RuntimeException:必ずしも常に発生を想定すべきとまでは言えない例外的状況を表すクラス
    • NullPointerException(変数がnullである)
    • ArrayIndexOutOfBoundsException(配列の添字が不正)
    • ...etc

Exceptionクラスのエラーに関しては必ず例外処理を行う必要があり、例外処理が未実装の場合はコンパイルエラーとなります。

Javaでの例外処理の実装方法

構文は次のようになります。

try {
  本来の処理
} catch (例外クラス 変数名) {
  例外が発生した場合の処理
} finally {
  例外の発生有無に関わらず必ず実行する処理
}

catch (例外クラス 変数名)で指定する例外クラスは、IOExcptionなどの具体的なエラークラス以外に、Exceptionクラスを指定することで例外をザックリ捉えて処理することもできます。

また、例外クラスは必ず次のようなメソッドを備えています。これらのメソッドの実行結果をログに出力することで、例外が発生した原因を特定するための情報を残すこともできます。

メソッド 意味
String getMessage() 例外的状況の解説文(いわゆるエラーメッセージ)を取得する。
void printStackTrace() スタックトレースの内容を画面に出力する。

thowsによる例外の伝搬

throws文は、メソッド内で例外処理を行わず呼び元に丸投げしたい時などに使います。

また、メソッド名を見ただけでどのようなエラーを返すか把握できるため、ソースの可読性も上がります。(と、私は自己解釈しました。)

構文は次のようになります。

/*
throwsの書式フォーマット
アクセス修飾子 戻り値 メソッド名(引数リスト) throws 例外クラス1,例外クラス2,... {
  メソッドの処理内容
}
*/

サンプルソースは以下になります。

throwによる例外的状況の報告

throw文を使うと、任意のタイミングで例外を発生させることができます。

throw new 例外クラス名("エラーメッセージ");

サンプルソースは以下になります。

オリジナル例外クラスの定義

Exceptionクラスを継承することで、オリジナル例外を作成することもできます。

super(msg)で渡す文字列を変更することで、例外発生時に呼ばれるgetMessage()で取得するメッセージをカスタマイズできます。

class オリジナル例外 extends Exception{
  オリジナル例外(String msg){
    super(msg);
  }
}

サンプルソースは以下になります。

参考情報

スッキリわかるJava入門 第2版

Javaでファイル読み込みする3つの方法 簡単なものから性能重視まで!

Java 独自の例外クラスを作成するサンプル

ウィキペディア アラサー

最後に

今回の「結論の箇条書き」の自己採点は💯です。 理由は、Javaでの例外処理の書き方をコンパクトにまとめることができたからです。