Javaプログラミング思想の異常処理エラー


エラー・ソースは、この問題をどのように正しく処理するかを知っている受信者に適切な情報を伝えることができる必要があります.例外処理はJavaで唯一の正式なエラーレポートメカニズムであり、コンパイラによって強制的に実行されます.
1コンセプト
  • 「異常」という言葉には「意外に思った」という意味があります.問題が発生して、あなたはどのように処理するべきか分からないかもしれませんが、あなたは確かに無視すべきではないことを知っています.他の人や他の場所にいて、この問題を処理できるかどうかを見てください.ただ、現在の環境ではこの問題を解決するのに十分な情報がないので、この問題をより高いレベルの環境に提出し、ここで正しい決定を下します.

  • 2基本異常
  • 例外が投げ出されると、まずJava内の他のオブジェクトと同様にnewを使用してスタック上に例外オブジェクトが作成されます.そして、現在の実行パス終了し、現在の環境から例外オブジェクトへの参照がポップアップされます.この場合、例外処理メカニズムはプログラムを引き継ぎ、適切な場所を探してプログラムを実行し始めます.この適切な場所は、プログラムをエラー状態から復元して、プログラムを別の方法で実行できるようにすることです.運転を続けます.
  • 異常により、(他の手段がなければ)プログラムの実行を強制的に停止し、どのような問題が発生したか、または(理想的な状態で)プログラムに問題を強制的に処理し、安定した状態に戻ることができます.
  • 2.1異常パラメータ
  • 常にnewを使用してスタック上に例外オブジェクトを作成します.これは、ストレージスペースの割り当てとコンストラクタの呼び出しを伴うものです.すべての標準例外クラスには2つのコンストラクタがあります.1つはデフォルトのコンストラクタです.もう1つは、関連情報を例外オブジェクトのコンストラクタに入れるためにパラメータとして文字列を受け入れることです.throw new NullpointerException("t = null "); newを使用して例外オブジェクトを作成した後、このオブジェクトの参照はthrowに渡されます.例外オブジェクトが返され、メソッドまたは役割ドメインが終了します.
  • は、例外タイプのルートクラスである任意のタイプのThrowableオブジェクトを放出することができる.通常、異なるタイプのエラーに対して、対応する例外を放出します.エラー情報は、例外オブジェクトの内部に保存するか、例外クラスの名前を使用して暗示できます.前の階層の環境では、これらの情報によって例外をどのように処理するかを決定します.(通常、例外オブジェクトに含まれる情報は例外タイプであり、それ以外に意味のある内容は含まれません.)
  • 3異常のキャプチャ
    異常がどのように捕獲されているかを理解するには,まず監視領域の概念を理解しなければならない.これは異常を生じる可能性のあるコードであり、後でこれらの異常を処理するコードです.
    3.1 tryブロック
    メソッドの内部に例外が投げ出された場合(またはメソッドの内部で呼び出された他のメソッドが例外を投げ出された場合)、このメソッドは例外を投げ出す過程で終了します.メソッドを終了させたくない場合は、メソッド内に特殊なブロックを設定して例外をキャプチャできます.
    try{
        //Code that might generate exceptions
    }

    3.2異常処理手順
    もちろん、投げ出された異常はどこかで処理されなければならない.この「場所」は例外ハンドラであり、取得する例外ごとに対応するハンドラを準備する必要があります.例外ハンドラはtryブロックの直後にキーワードcatchで表示されます.
    try{
        //Code that might generate exceptions
    }catch(Type1 id1){
        //handle exceptions of Type1
    }catch(Type2 id2){
        //handle exceptions of Type2
    }
    //etc...

    例外ハンドラはtryブロックの後に続く必要があります.異常が投げ出されると、異常処理メカニズムは、パラメータが異常タイプに一致する最初の処理プログラムを検索する責任を負う.次にcatch句実行に入り,異常と判断して処理した.catch句が終了すると、プロセッサの検索プロセスが終了します.なお、一致するcatch句のみが実行されます.
    4カスタム例外の作成
    自分で異常クラスを定義するには、既存の異常クラスから継承する必要があります.意味の近い異常クラス継承を選択することが望ましいです.新しい例外クラスを作成する最も簡単な方法は、コンパイラにデフォルトのコンストラクタを生成させることです.class simpleException extends Exception{} // 異常にとって最も重要な部分はクラス名である.
    5異常説明
  • Javaは、このメソッドを使用するクライアント・プログラマーに、メソッドが投げ出す可能性のある異常を通知することを奨励します.これは優雅な方法であり、呼び出し者がどのようなコードを書くかを正確に知ることができ、すべての潜在的な異常をキャプチャすることができる.例外は、メソッド宣言の一部であり、形式パラメータのリストに続いています.
  • コードは、例外の説明と一致する必要があります.メソッドのコードに例外が発生しても処理されていない場合、コンパイラはこの問題を発見し、この例外を処理するか、例外の説明でこのメソッドが例外を発生することを示すかを注意します.

  • 6異常のキャプチャ
    例外タイプのベースクラスExceptionを例外ハンドラリストの末尾に置いて、他のハンドラを奪う前に例外をキャプチャしないようにしたほうがいいです.
    6.1スタック軌跡
    void printStackTrace()  //       
    void printStackTrace(PrintStream) 
    void printStackTrace(java.io.PrintWriter)  //       

    ThrowableとThrowableのスタックトラックを印刷します.呼び出しスタックには、「異常に投げ出された場所に連れて行く」メソッド呼び出しシーケンスが表示されます.
    6.2異常の再放出
    現在のオブジェクトへの参照がすでに得られている以上、直接投げ出すことができます.
    catch(Exception e){
      //e.printStackTrace();
      throw e;
     }

    再放出異常は、同じtryブロックの後続catch文が無視される前のレベルの環境の異常ハンドラに異常を放出します.また、異常オブジェクトのすべての情報が保持されるため、上位レベルの環境でこの異常をキャプチャするプロセッサは、この異常オブジェクトからすべての情報を得ることができる.現在の例外オブジェクトを再放出するだけであれば、printStackTrace()メソッドは、再放出ポイントの情報ではなく、元の例外放出ポイントの呼び出しスタック情報を表示します.この情報を更新するには、fillInStackTrace()メソッドを呼び出すと、現在の呼び出しスタック情報を元の例外オブジェクトに埋め込むことによって作成されたThrowableオブジェクトが返されます.
    public class Rethrowing{
        public static void f() throws Exception{
            System.out.println("originating the exception in f()");
            throw new Exception("thrown from f()");
        }
        public static void g() throws Exception{
            try{
                f();
            }catch(Exception e){
                System.out.println("Inside g(),e.printStackTrace()");
                e.printStackTrace(System.out);
                throw e;
            }
        }
        public static void h() throws Exception{
            try{
                f();
            }catch(Exception e){
                System.out.println("Inside h(),e.printStackTrace()");
                e.printStackTrace(System.out);
                throw (Exception)e.fillInStackTrace();
            }
        }
        public static void main(String[] args){
            try{
                g();
            }catch(Exception e){
                System.out.println("main:printStackTrace()");
                e.printStackTrace(System.out);
            }
    
            try{
                h();
            }catch(Exception e){
                System.out.println("main:printStackTrace()");
                e.printStackTrace(System.out);
            }
        }
    
    }
    
    /*
         :
    originating the exception in f()
    Inside g(),e.printStackTrace()
    java.lang.Exception: thrown from f()
            at Rethrowing.f(Rethrowing.java:4)
            at Rethrowing.g(Rethrowing.java:8)
            at Rethrowing.main(Rethrowing.java:26)
    main:printStackTrace()
    java.lang.Exception: thrown from f()
            at Rethrowing.f(Rethrowing.java:4)
            at Rethrowing.g(Rethrowing.java:8)
            at Rethrowing.main(Rethrowing.java:26)
    originating the exception in f()
    Inside h(),e.printStackTrace()
    java.lang.Exception: thrown from f()
            at Rethrowing.f(Rethrowing.java:4)
            at Rethrowing.h(Rethrowing.java:17)
            at Rethrowing.main(Rethrowing.java:33)
    main:printStackTrace()
    java.lang.Exception: thrown from f()    //  fillInStackTrace()            
            at Rethrowing.h(Rethrowing.java:21)
            at Rethrowing.main(Rethrowing.java:33)
    */

    6.3異常チェーン
    通常、1つの異常をキャプチャした後に別の異常を投げ出し、元の異常の情報を保存したいと考えられます.これは異常チェーンと呼ばれます.Throwableのすべてのサブクラスがコンストラクタで1つのcauseを受け入れるようになりましたオブジェクトをパラメータとして使用します.このcauseは、元の例外を表すために使用されます.これにより、元の例外を新しい例外に渡すことで、現在の位置に新しい例外が作成されて投げ出されても、この異常チェーンを介して異常が最初に発生した位置を追跡できます.Throwableのサブクラスでは、3つの基本的な例外クラスのみがcauseパラメータ付きコンストラクタを提供します.これらはError(Java仮想マシンでシステムエラーを報告するために使用される)、Exception、およびRuntimeExceptionです.他のタイプの例外をリンクする場合は、コンストラクタではなくinitCause()メソッドを使用する必要があります.
    *RuntimeException(およびそのサブクラス)タイプの例外は、コードでのみ無視できます.他のタイプの例外の処理は、コンパイラによって強制されます.その原因を究明すると、RuntimeExceptionはプログラミングエラーを表しています.*