Java-例外処理

例外処理とは

アプリケーションエラー発生時のプログラム対処です。


例外処理の実装

try-catchでエラー発生時の処理を記述します。



class MyClass{
  public static void main (String[] args) {
    try {
      // 例外が発生する可能性のあるブロック
    }catch(例外の種類1 param1){
      // 例外の種類1が発生した場合に実行される部分
    }catch(例外の種類2 param1){
      // 例外の種類2が発生した場合に実行される部分
    }finally{
      // 例外が起きても起きなくても実行される部分
    }
  }
}

例外の種類

ClassNotFoundException 呼び出そうとしたクラスのクラスファイルが無かった場合
CloneNotSupportedException オブジェクトを複製するために Object クラスの clone メソッドが呼び出されたが、そのオブジェクトのクラスが Cloneable インタフェースを実装していないことを示すためにスローされます。
DataFormatException データ形式エラーが発生したことを通知します。
IOException なんらかの入出力例外の発生を通知するシグナルを発生させます。サブクラスとしてEOFException, FileNotFoundExceptionなどがあります
PrinterException 印刷システムに例外的な状態が発生したことを示すために使用されます。サブクラスとしてPrinterAbortException, PrinterIOExceptionがあります。
RuntimeException JVMの通常の処理でスローすることができる各種の例外のスーパークラスです。
ArithmeticException RuntimeExceptionのサブクラスです。算術計算で例外的条件が発生した場合にスローされます。たとえば、「ゼロで除算される」整数はこのクラスのインスタンスをスローします。
ArrayStoreException RuntimeExceptionのサブクラスです。不正な型のオブジェクトをオブジェクトの配列に格納しようとしたことを示すためにスローされます。
ClassCastException RuntimeExceptionのサブクラスです。あるオブジェクトを継承関係にないクラスにキャストしようとしたことを示すためにスローされます。
IllegalArgumentException RuntimeExceptionのサブクラスです。不正な引数、または不適切な引数をメソッドに渡したことを示すためにスローされます。
IndexOutOfBoundsException RuntimeExceptionのサブクラスです。ある種のインデックス (配列、文字列、ベクトルなど) が範囲外であることを示すためにスローされます。サブクラスにArrayIndexOutOfBoundsException, StringIndexOutOfBoundsExceptionがあります。
NegativeArraySizeException RuntimeExceptionのサブクラスです。負のサイズを持った配列をアプリケーションが作成しようとした場合にスローされます。NoSuchElementException RuntimeExceptionのサブクラスです。この列挙にそれ以上の要素がないと、Enumeration の nextElement メソッドによってスローされます。
NullPointerException RuntimeExceptionのサブクラスです。オブジェクトが必要な場合に、アプリケーションが null を使おうとするとスローされます。
SecurityException RuntimeExceptionのサブクラスです。セキュリティマネージャによってスローされ、セキュリティ違反を示します。サブクラスにAccessControlException, RMISecurityExceptionがあります。
NumberFormatException IllegalArgumentExceptionのサブクラスです。アプリケーションが文字列を数値型に変換しようとしたとき、文字列の形式が正しくない場合にスローされます。

throw

そのキャッチブロックでのみ例外処理をするだけでなく、呼び出し元のキャッチブロックでも例外処理をしなければならないような場合に使います。

例外は受け取るだけでなく、呼び出し元に例外処理を任せる(例外を投げる)ために記述します。


public class Test{
    public static void main(String args[]){
        try{
            a();
        }catch(RuntimeException e){
            System.err.println("main()例外処理" + e);
        }
    }

    public static void a(){
        try{
        }catch(RuntimeException e){
            System.err.println("a()例外処理" + e);
            throw e;
        }
    }
}

throws

例外を投げる可能性があるコンストラクタやメソッドを明示するために使用します。


class MyException extends Exception {
    public String errMsg;
    MyException(String msg) { errMsg = msg; }
}
class ThrowTest {
    static void methodA() throws MyException {
        MyException e = new MyException("Error occured.");
        throw e;
    }
    public static void main(String[] args) {
        try {
            methodA();
        } catch (MyException e) {
            System.out.println(e.errMsg);
        }
    }
}


関連ページ