トップ
トップ >  プログラミング言語 >  Java >  例外
例外
概要
例外処理機構とは、エラー等の例外的な処理を行うための仕組みです。

解説
Javaには例外的なケースを扱う例外処理機構が用意されています。
例外処理を局所化することで、 正常時の処理と例外時の処理を混在させないですみます。 throwされうる例外はtryブロック内にあるか、throwsで宣言されている必要があります。

例外の捕捉
書式
try{
  処理
}
[catch(例外の型 変数名){
  例外時の処理
}]…
[finally{
処理
}]
ただし、catchまたはfinallyのいずれかが必要です。
項目説明
例外の型キャッチする例外の型を指定します。
変数名キャッチした例外にアクセスするための変数名を指定します。
また、発生場所と、例外を処理する場所が離れているのが一般的ですが、 例外処理を使うとスタックトレースによって、適切に処理できる箇所まで呼び出し元を遡ります。 method1() throws 例外{
コード ここで発生する可能性のある例外は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例外処理が必須でないクラスです。

代表的な例外
クラス説明
IllegalArgumentExceptionRutimeExceptionのサブクラス
NumberFormatExceptionIllegalArgumentExceptionのサブクラス
IndexOutOfBoundsExceptionRuntimeExceptionのサブクラス
IllegalstateExceptionRuntimeExceptionのサブクラス
CloneNotSupportExceptionExceptionのサブクラス
ClassCastExceptionRuntimeExceptionのサブクラス
ArrayIndexOutOfBoundsExceptionIndexOutOfBoundsExceptionのサブクラス
ArthimeticExceptionRuntimeExceptionのサブクラス,0除算で発生
NullPointerExceptionRuntimeExceptionのサブクラス

独自の例外の作成
Throwableから派生すれば、スローやキャッチ可能ですが、
一般に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独自の例外を作成しています。
トップ >  プログラミング言語 >  Java >  例外