はしくれエンジニアもどきのメモ

情報系技術・哲学・デザインなどの勉強メモ・備忘録です。

Java の例外処理メモ

Java の例外処理メモ

Java の例外処理について勉強したのでメモ。よく見るであろうエラーをまとめておく。

try-catch-finally

以下のように、書くと例外処理をすることができます。


try {
  // try block
} catch (<ExeptionType> <param&gt){
  // 例外処理block
}
finally {
  // finally block
}

try block に、例外の発生の監視が必要なコードを書く。

もし、例外が発生した場合、例外オブジェクトがcatch blockのパラメータ(ExceptionType) と一致したなら、その例外処理blockが実行される。

finally block は、例外のあるなしに関わらず処理の最後に実行されます。 リソースの開放に使うと便利である(ex. .close();など)。

例外とエラークラス

catchブロックには、必ず1つThrowable型 のパラメータが必要になる。

Throwableクラス

Throwableクラスは、全ての例外及びエラークラスのスーパークラスである。

Throwableクラスでは、以下のメソッドをよく使う。

getMessage() は、エラーメッセージの文字列を返す。


String getMessage()

printStackTrace() は、問題が発生した時点のスタック情報を表示する。


void printStackTrace()

詳細:Throwable (Java Platform SE 8)

Errorクラス

Errorクラスは、Throwableクラスを拡張する。JVMで検出される可能性がある重大な問題を表す以下の様なサブクラスがあります。

詳細: Error (Java Platform SE 8)

Exeption

Exeptionクラスも、Errorクラス同様、Throwableクラスを拡張しています。 実行時に発生する可能性がある問題を表すサブクラスがある。

詳細:Exception (Java Platform SE 8)

RuntimeExceptionクラス

RuntimeExceptionクラスは、Exceptionクラスのサブクラスです。 プログラム実行中に発生する頻度が高い問題を表す。 以下に、よく見るRuntimeException のサブクラスを示す。

throwsステートメントと非チェック例外、チェック例外

throwsステートメント

throwsステートメントでは、例外が投げられる可能性があるメソッドを書いた場合に、どの例外が投げられるかを明示することができる。

コンストラクタでは、以下の様に書く。


ClassName() throws <exception_1>, <exception_2>, ... <exception_n>  {
  // コンストラクタの本体
}

メソッドでも同様です。


type Method(method_params) throws <exception_1>, <exception_2>, ... <exception_n> {
  // メソッドの本体
}

非チェック例外、チェック例外

Javaコンパイラでは、各コンストラクタとメソッドをチェックし、生成される例外の種類をチェックする。 そして、Exceptionには、2種類ある。

  • チェック例外:

    RuntimeException 以外のException。 生成される例外をtry ~ catchで捕獲するか、throws で宣言する必要がある。 しないとコンパイルエラーになる。

  • 非チェック例外:

    RuntimeException とそのサブクラスのException。 チェック例外と違って、生成される例外を捕獲、宣言をしなくてもコンパイルエラーにならない。 が、起こりえそうなRuntimeException をthrows で宣言し、明示しておくとわかりやすいコードになる。

例外処理サンプル

ObjectOutputStream のwriteObjectメソッドで出力されたファイルを、ObjectInputStream のreadObjectメソッドで入力する例です。

while無限ループでファイルからreadObjectメソッドでObjectを読み込み、ファイルの最後まで読んだら、 EOFException が発生するので、try-catch の中でbreak; で無限ループから抜けて、読み込んだデータの処理をします。

ObjectOutputStream のwriteObjectメソッドで出力されたファイルを読み込む ...