例外 とは予期しなかった処理のことを言います。
Java では例外が発生するとスレッドが終了します。単一スレッドの場合はプログラムが終了します。例外が発生してもスレッドを終了させたくない場合、次の2つのうちいずれかの方法を行います。
例外が発生してもスレッドを終了させたくない場合、例外をキャッチする必要があります。
try {
// 例外が発生する可能性のある処理
} catch (Exception e) {
// 例外が発生したときに行う処理
}
try
ブロック(
try { }
)内で例外が発生すると、そこで処理を中断して
catch
ブロック(
catch () { }
)に処理が移ります。
例外をキャッチすると、例外が発生したときに行う処理を記述することができます。通常、ここではリソースの解放やメソッドの戻り値の設定、エラーメッセージの表示などの処理を行います。
また、finallyブロックを使用すると、例外が発生しなかった場合と例外が発生した場合のいずれの場合にも最後に行う処理を記述することができる。
try {
// 例外が発生する可能性のある処理
} catch (Exception e) {
// 例外が発生したときに行う処理
} finally {
// 最後に必ず行う処理
}
メソッドでスロー宣言を行うと、例外が発生したときに処理を中断して、メソッドの呼び出し側に処理を戻すことができます。
メソッドの呼び出し側ではスローされた例外が発生します。メソッドの呼び出し側で例外のキャッチを行っていなければ、そこでスレッドは終了します。例外をキャッチしていれば、例外に対するエラー処理を行うことができます。
public void myFunction() throws IOException, NumberFormatException
{
// IOException例外または
// NumberFormatException例外が
// 発生する可能性がある処理
}
try-with-resourcesは、文の終わりで各リソースが自動的に閉じられる。
String example(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) {
br.close();
}
}
}
上記のJavaプログラムをtry-with-resources文で書きなおすと、次のようになる。
String example(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
br.close()が明示的に記述されていないが、try-with-resources文が正常に終了したか例外がスローされたかに関わらず、自動的にクローズされる。
ただし、try-with-resources文で自動的にクローズできるリソースは、java.lang.AutoCloseableインタフェースを実装しているオブジェクトに限られる。java.io.Closeableの派生クラスであれば自動的にクローズされる。
例外 | 説明 |
---|---|
java.lang.AssertionError | アサーションに失敗した |
java.lang.NullPointerException | nullオブジェクトにアクセスした |
java.sql.SQLException | JDBCパッケージがスローする例外 |
Exceptionクラスはjava.lang.Throwableクラスのサブクラスです。Exceptionクラスで使用できるメソッドについては、java.lang.Throwableクラスを参照してください。
Errorクラスはjava.lang.Throwableクラスのサブクラスです。Errorクラスで使用できるメソッドについては、java.lang.Throwableクラスを参照してください。
戻り値の型 | メソッド | 説明 |
---|---|---|
String |
getMessage() |
詳細メッセージ文字列を返す。 |
void |
printStackTrace() |
バックトレースを標準エラーストリームに出力する。 |
void |
printStackTrace(PrintStream
s
)
|
バックトレースを指定した印刷ストリームに出力する。 |
void |
printStackTrace(PrintWriter
s
)
|
バックトレースを指定したプリントライターに出力する。 |
Throwableクラスは、java.lang.Exceptionクラスおよびjava.lang.Errorクラスのスーパークラスです。
Throwableクラスでよく使われるメソッドの一覧を次に示します。
java.lang.Exceptionクラスを継承して、独自の例外クラスを作成することができます。
class MyException extends Exception {
public MyException() {
super();
}
}
例外またはエラーを明示的にスローすることができます。スローできるのは java.lang.Throwableクラスの派生クラスだけです。
独自の例外クラス
MyException
をスローするJavaソースコードの例を次に示します。
throw MyException;
NullPointerExceptionは、nullオブジェクトにアクセスしたときにスローされる例外である。
NullPointerExceptionが発生するプログラムの例を示す。
public class NullPointerExceptionExample1 {
public String foo = "NullPointerExceptionExample1";
public static void main(String[] args) {
NullPointerExceptionExample1 npee1 = null;
System.out.println(npee1.foo);
}
}
public class NullPointerExceptionExample2 {
public static void main(String[] args) {
NullPointerExceptionExample1 npee2 = null;
npee2.foo();
}
public void foo() {
System.out.println("NullPointerExceptionExample2");
}
}