Java の例外処理メモ
Java の例外処理メモ
Java の例外処理について勉強したのでメモ。よく見るであろうエラーをまとめておく。
try-catch-finally
以下のように、書くと例外処理をすることができます。
try {
// try block
} catch (<ExeptionType> <param>){
// 例外処理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で検出される可能性がある重大な問題を表す以下の様なサブクラスがあります。
-
形式のエラー(ClassFormatError)
-
スタックのオーバーフロー(StackOverflowError)
-
内部エラー(InternalError)
-
メモリ不足(OutOfMemoryError)
-
未知のエラー(UnknownError)
-
etc.
詳細: Error (Java Platform SE 8)
Exeption
Exeptionクラスも、Errorクラス同様、Throwableクラスを拡張しています。 実行時に発生する可能性がある問題を表すサブクラスがある。
- ClassNotFoundException:
クラスが見つからなかった。
- IllegalAccessException:
クラスに不正にアクセスしようとした。
- InstantiationException:
インターフェースまたは抽象クラスをインスタンス化しようとした。
- InterruptedException:
スレッドに割り込みが入った。
- /NoSuchFieldException:
フィールドが見つからなかった。
- NoSuchMethodException:
メソッドが見つからなかった。
- RuntimeException:
実行時に例外が発生した(Exceptionクラスの中で最も重要)。
詳細:Exception (Java Platform SE 8)
RuntimeExceptionクラス
RuntimeExceptionクラスは、Exceptionクラスのサブクラスです。 プログラム実行中に発生する頻度が高い問題を表す。 以下に、よく見るRuntimeException のサブクラスを示す。
- ArithmeticException:
算術例外が発生した(整数を0で除算したなど)。 (※double, float のゼロ除算では例外にならない。)
- ArrayIndexOutOfBoundsException:
配列のindex が実在しない要素を指していた。
- ArrayStoreException:
不正な型のオブジェクトをオブジェクトの配列に格納しようとした。
- ClassCastException:
不正な型変換を試みた。
-
IllegalArgumentException: 不正な引数をメソッドに渡した。
- NegativeArraySizeException:
配列のサイズとして負の値を使った。
- NullPointerException:
空のオブジェクトのフィールドまたはメソッドにアクセスしようとした。ぬるぽの元ネタ。
- SecurityException:
セキュリティ違反のため操作が拒否された。
- TypeNotPresentException:
型の定義が見つからなかった。
- UnsupportedOperationException:
要求された操作がサポートされていなかった(Java Collections Framework)。
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メソッドで出力されたファイルを読み込む ...
参考リンク
-
- 作者: ジョゼフ・オニール,武藤健志,トップスタジオ
- 出版社/メーカー: 翔泳社
- 発売日: 2008/05/29
- メディア: 大型本
- 購入: 1人 クリック: 55回
- この商品を含むブログ (21件) を見る