JAva異常メカニズム


Java例外クラスの階層図を次に示します.
java.lang.Object
  java.lang.Throwable
      java.lang.Exception
        java.lang.RuntimeException
      java.lang.Error
        java.lang.ThreadDeath
1、Throwable
        Throwableクラスは、Java言語のすべてのエラーまたは例外のスーパークラスです.オブジェクトがこのような(またはそのサブクラスの1つ)インスタンスである場合にのみ、Java仮想マシンまたはJava throw文から放出されます.同様に、catch句のパラメータタイプは、このようなサブクラスまたはそのサブクラスの1つのみであってもよい.
2つのサブクラスの例ErrorとExceptionは、通常、例外が発生したことを示すために使用されます.通常、これらのインスタンスは、例外のコンテキストで最近作成されたため、スタックトラッキングデータなどの関連情報が含まれています.
2、Exception
        ExceptionクラスとそのサブクラスはThrowableの形式であり、合理的なアプリケーションがキャプチャしたい条件を指摘し、プログラム自体が処理できる異常を示している.
3、Error
        ErrorはThrowableのサブクラスであり,プログラム自体だけでは回復できない重大なエラーを表し,合理的なアプリケーションがキャプチャしようとしないことを示す重大な問題である.
このメソッドを実行する間、Javaコンパイラは、Javaコンパイラがチェックしないため、throws宣言によって投げ出される可能性がありますが、キャプチャされていないErrorのサブクラスを宣言する必要はありません.つまり、プログラムにこのような異常が発生する可能性がある場合、try...catch文で捕獲されていなくても、throws文宣言で投げ出されていない場合、コンパイルされます.
4、RuntimeException
        RuntimeExceptionは、Java仮想マシンが正常に動作している間に放出される可能性のある異常なスーパークラスです.Javaコンパイラはそれをチェックしません.つまり、プログラムにこのような異常が発生する可能性がある場合、try...catch文でキャプチャされていなくても、throws文で宣言されて投げ出されていない場合でも、コンパイルされます.この異常はコード実装を改善することで回避できます.
5、ThreadDeath
        Threadクラスにゼロパラメータを持つstopメソッドを呼び出すと、被害スレッドはThreadDeathインスタンスを放出します.
        このクラスのインスタンスは、アプリケーションが非同期で終了した後に消去する必要がある場合にのみ取得されます.ThreadDeathがメソッドによってキャプチャされた場合、スレッドを本当に終了させるには、スレッドを再放出することが重要です.
ThreadDeathがキャプチャされていない場合、トップレベルのエラーハンドラはメッセージを出力しません.
        ThreadDeathクラスは「正常に出現」しますが、多くのアプリケーションが出現したすべてのExceptionをキャプチャし、放棄するため、ExceptionのサブクラスではなくErrorのサブクラスにすぎません.
        以上、異常APIに関する簡単な紹介ですが、使い方は簡単です.肝心なのは異常処理の原理を理解することです.具体的な使い方はJava APIドキュメントを参照してください.
次に、例外処理に関する論理コードを示します.

public class ExceptionTest {

	public static void main(String args[]){
		
		function1();
		System.out.println("do in main");
	}
	static Exception1 exp1;
	private static void function1(){
		exp1=new Exception1();
		try{
		   System.out.println("t3");
		   throw new Exception2();
                      //unreached code
		}catch(Exception2 e2){
			System.out.println("t1");
			try{
				throw exp1;
				//System.out.println(1/0);
				//System.out.println("dddd");
			}catch(Exception e){
				System.out.println("t2");
			}finally{
				System.out.println("t5");
			}
		}finally{
			System.out.println("t4");
		}
			
		
	}
	
	private static void function2(){
		System.out.println("do in function2");
	}
	
	private static void function3(){
		System.out.println("do in function3");
	}
}

class Exception1 extends Exception{
	
	public void println(String str){
		System.out.println("Exception1 :"+str);
	}
}

class Exception2 extends Exception{
	
}

出力結果:
t3
t1
t2
t5
t4
do in main
以上から分かるように、
プログラムが例外を投げ出すと、対応するキャプチャコードによって例外がキャプチャされ、例外文の後ろに投げ出されたコードは実行されません.上へ実行し、メソッドを呼び出す場所を知り、下へ実行し続けます.
try catch文はネストして使用でき、finally文は常に実行されます.