Javaの例外 (Exception)

Table of Contents

  1. 例外のキャッチ
  2. try-with-resources
  3. java.lang.Errorクラス
  4. java.lang.Throwableクラス
  5. 独自の例外クラスを作成する
  6. 例外をスローする

例外 とは予期しなかった処理のことを言います。

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

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の派生クラスであれば自動的にクローズされる。

Exceptionの一覧

例外 説明
java.lang.AssertionError アサーションに失敗した
java.lang.NullPointerException nullオブジェクトにアクセスした
java.sql.SQLException JDBCパッケージがスローする例外

java.lang.Exceptionクラス

Exceptionクラスはjava.lang.Throwableクラスのサブクラスです。Exceptionクラスで使用できるメソッドについては、java.lang.Throwableクラスを参照してください。

java.lang.Errorクラス

Errorクラスはjava.lang.Throwableクラスのサブクラスです。Errorクラスで使用できるメソッドについては、java.lang.Throwableクラスを参照してください。

java.lang.Throwableクラス

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クラスの派生クラスだけです。

throw Throwableクラスの派生クラス名 ;

独自の例外クラス MyException をスローするJavaソースコードの例を次に示します。

throw MyException;

java.lang.NullPointerException

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");
  }
}