Javaではどのような例外が用意されているのかみてみます。用意されている例外全てを紹介することはもちろん出来ませんので、、SJC-Pに出てきそうな範囲でいくつかの挙げてみます。
java.lang.Object
|
+--java.lang.Throwable
|
+--java.lang.Error
|
+--java.lang.Exception
|
+--java.lang.RuntimeException
|
+--検査例外
java.lang.Throwable
このThrowable クラスは、Java 言語におけるすべてのエラーと例外のスーパークラスになります。このクラスのインスタンス、若しくはこのクラスから派生したサブクラスのインスタンスだけが JVMによってスローされるか、Java の throw ステートメントによってスローすることができます。 また同じように、このクラス若しくは派生したサブクラスのだけが catch ステートメントの引数の型に指定することができます。
java.lang.Error
Error クラスは Throwableの派生クラスになりますが、Errorクラスのサブクラスは、通常のアプリケーションではキャッチする必要のない重大な問題を定義します。たとえば JVMの問題によってメモリ空間が割り当てられなかったとか、そういった具合です。
| OutOfMemoryError |
メモリ不足のために JVMがオブジェクトを割り当てることが出来ない |
| StackOverflowError |
アプリケーションでの再帰の回数が多すぎてスタックオーバーフローが発生 |
|
java.lang.Exception
Exception クラスとそのサブクラスは上記の Errorクラスと異なり、通常のアプリケーションでキャッチされる可能性のある状態を示す Throwable の形式の 1 つです。 そういった意味で狭義の例外といえば Exceptionとそのサブクラスを指します。
java.lang.RuntimeException
RuntimeException は JVM の通常の処理でスローすることができる各種の例外のスーパークラスです。 RuntimeException クラスとそのサブクラスは非検査例外と呼ばれ、コンパイル時にこれらはチェックされません。
| AithmeticException |
0による除算など |
| ArrayStoreException |
配列に無効な型の値を格納 |
| ClassCastException |
不適当なキャスト |
| IndexOutOfBoundsException |
範囲外の配列要素へのアクセス |
| NullPointerException |
null値の変数を使用 |
|
[ Example_12_04.java ]
import java.io.*;
public class Example_12_04 {
public static void main(String[] args) {
int i = 5 / 0; // ※1
throw new ClassCastException() // ※2
}
}
※ 1.
0による除算で必ず ArithmeticExceptionが発生することは明らかですが、コンパイルエラーにはならず実行時に例外が発生します。
※ 2.
throwステートメントで明示的に例外をスローしていますが、非検査例外なので エラーハンドラを記述すしなくてもコンパイルエラーにはなりません。
検査例外
上記 RuntimeException クラスとそのサブクラスは以外は検査例外と呼ばれ、コンパイル時にコンパイラによってチェックされます。プログラマが任意に検査例外をスローするコードを記述した場合や、メソッドがスローする可能性があることを明示している場合は、それに対するエラーハンドラが必要になります。
| ClassNotFoundException |
0による除算など |
| java.io.IOException |
入出力の例外 |
| java.io.FileNotFoundException |
指定したファイルが見つからない |
|
[ Example_12_05.java ]
import java.io.*;
public class Example_12_05 {
public static void main(String[] args) {
throw new ClassNotFoundException() // ※1
}
}
※ 1.
今度は明示的に検査例外である ClassNotFoundExceptionをスローしています。この例外は検査例外なのでコンパイル時にチェックされ、このソースはコンパイルエラーとなります。コンパイルを通るようにするには、エラーハンドラを用意するか、メソッドから throw句で例外が発生することを明示する必要があります。