例外
概要
解説

例外処理機構とは、エラー等の例外的な処理を行うための仕組みです。
解説
Javaには例外的なケースを扱う例外処理機構が用意されています。
例外処理を局所化することで、 正常時の処理と例外時の処理を混在させないですみます。 throwされうる例外はtryブロック内にあるか、throwsで宣言されている必要があります。
例外処理を局所化することで、 正常時の処理と例外時の処理を混在させないですみます。 throwされうる例外はtryブロック内にあるか、throwsで宣言されている必要があります。
例外の捕捉
書式
コード ここで発生する可能性のある例外はthrowsで全て捕らえる必要があります。
try{
コード ここで発生する可能性のある例外はthrowsかcatchで全て捕らえる必要があります。
}
catch(例外クラス 変数名){ 例外クラスと一致(サブクラスを含む)したものを捕らえます。
}
...
finally{ try内に入った場合、例外の有無にかかわらずに処理を行います。
}
スタックトレースについて
例外処理を使うとスタックトレースによって、適切に処理できる箇所まで呼び出し元を遡ります。
try{
処理
}
[catch(例外の型 変数名){
例外時の処理
}]…
[finally{
処理
}]
ただし、catchまたはfinallyのいずれかが必要です。
また、発生場所と、例外を処理する場所が離れているのが一般的ですが、
例外処理を使うとスタックトレースによって、適切に処理できる箇所まで呼び出し元を遡ります。
method1() throws 例外{ 処理
}
[catch(例外の型 変数名){
例外時の処理
}]…
[finally{
処理
}]
ただし、catchまたはfinallyのいずれかが必要です。
項目 | 説明 |
例外の型 | キャッチする例外の型を指定します。 |
変数名 | キャッチした例外にアクセスするための変数名を指定します。 |
コード ここで発生する可能性のある例外はthrowsで全て捕らえる必要があります。
try{
コード ここで発生する可能性のある例外はthrowsかcatchで全て捕らえる必要があります。
}
catch(例外クラス 変数名){ 例外クラスと一致(サブクラスを含む)したものを捕らえます。
}
...
finally{ try内に入った場合、例外の有無にかかわらずに処理を行います。
}
スタックトレースについて
例外処理を使うとスタックトレースによって、適切に処理できる箇所まで呼び出し元を遡ります。
例
ソースコード | 結果 | 説明 |
try{ throw new Exception(); } catch(Exception e){ System.out.println("catch内"); } finally{ System.out.println("finally内"); } System.out.println("try,catch外"); |
catch内 finally内 try,catch外 | 例外がcatchされ、catchブロックとfainallyブロックに処理が移ります。 |
public void testThrows(){ try{ methodA(); } catch(Exception e){ System.out.println("catch内"); } } public void methodA() throws Exception{ throwMethod(); try{ throw new Exception(); } catch(Exception e){ System.out.println("methodAのcatch内"); } finally{ System.out.println("finally内"); } System.out.println("try,catch外"); } | catch内 | methodAで例外が発生し、呼び元のtestThrowsにさかのぼり、testThrows内のcatchで補足されます。 |
public void testFinally(){ try{ methodB(); } catch(Exception e){ System.out.println("testFinallyのcatch内"); } } public void methodB() throws Exception{ try{ throw new Exception(); } finally{ System.out.println("methodBのfinally内"); } } | methodBのfinally内 testFinallyのcatch内 | methodBのtryで発生した例外はfinallyが実行された後で呼び元のtestFinallyにさかのぼります。。 |
例外の発生
書式
throw 例外オブジェクト;
例外を投げる場合、throwを使用します。
項目 | 説明 |
例外オブジェクト | スロー対象のオブジェクトです。 |
例外処理に関わるクラス

クラス | 説明 |
Throwable | スロー可能なクラスです。 |
Exception | 例外を表すクラスです。 |
Error | エラーを表すクラスです。キャッチしても意味がないクラスです。 |
RuntimeException | 例外処理が必須でないクラスです。 |
代表的な例外
クラス | 説明 |
IllegalArgumentException | RutimeExceptionのサブクラス |
NumberFormatException | IllegalArgumentExceptionのサブクラス |
IndexOutOfBoundsException | RuntimeExceptionのサブクラス |
IllegalstateException | RuntimeExceptionのサブクラス |
CloneNotSupportException | Exceptionのサブクラス |
ClassCastException | RuntimeExceptionのサブクラス |
ArrayIndexOutOfBoundsException | IndexOutOfBoundsExceptionのサブクラス |
ArthimeticException | RuntimeExceptionのサブクラス,0除算で発生 |
NullPointerException | RuntimeExceptionのサブクラス |
独自の例外の作成
Throwableから派生すれば、スローやキャッチ可能ですが、
一般にExceptionクラスから派生します。
例
一般にExceptionクラスから派生します。
例
ソースコード | 結果 | 説明 |
public void testOriginalException(){ try{ throw new E1(); } catch(Exception e){ System.out.println(e.getMessage()); } } class E1 extends Exception{ public E1(){ super("E1"); } } | E1 | 独自の例外を作成しています。 |