Exception


異常と異常処理


Javaではexceptionを例外と呼び、エラーです.
例外は、プログラムまたはコンパイラの実行時に使用できない状態を作成することです.
では、異常処理とは何ですか.
異常処理は、異常が発生しないようにソースを制御し、異常を処理します.
要約すると、例外はエラーであり、プログラムの実行またはコンパイル時に使用不可能な状態が発生し、この状況を予測して処理することを例外処理と呼ぶ.

JAvaが異常をどのように処理するか(try、catch、throw、throws、finally)

  • Try Block::実際のコードを含む場所に異常が発生する可能性のあるコードを記述します.
  • Catch Block::try Blockで異常が発生した場合、catchに移動し、このセクションで後で処理するコードを記述します.
  • Finallyブロック:tryブロックでは、例外が発生するかどうかにかかわらず、無条件に実行されるコードです.(省略可能)
  • try-catch-finallyコード

    public class Main {
        public static void main(String[] args) {
    
            int a = 10;
            int b = 0;
            int result = 0;
    
            try {
                result = a / b;
            } catch (IllegalAccessError e) {
                System.out.println("IllegalAccessError");
                System.out.println(e.getClass().getName());
            } catch (ArithmeticException e) {
                System.out.println("ArithmeticException");
                System.out.println(e.getClass().getName());
            } finally {
                System.out.println(result);
            }
        }
    }

    try-catch-finallyコード結果

    ArithmeticException
    java.lang.ArithmeticException
    0
    コードを確認した後、10を0で割るとエラーが発生します.
    Resultは演算を行い,演算中にエラーが発生するためtryでマスクした値を得た.
    例外が発生した場合、try以降のcatchに移動します.
    まず最初のcatchに移動します.エラー自体が最初のcatch IllegalAccessErrorとは無関係なので、次のcatch ArithemicExceptionに移動します.
    演算中に発生する異常はArithmeticExceptionであるため、このcatchで記述されたコードが実行され、finallyに移動すると、コードが実行されます.

    catch文の再試行-catchコード

    public class Main {
        public static void main(String[] args) {
    
            int a = 10;
            int b = 0;
            int result = 0;
    
            try {
                result = a / b;
            } catch (IllegalAccessError e) {
                System.out.println("IllegalAccessError");
                System.out.println(e.getClass().getName());
            } catch (ArithmeticException e) {
                System.out.println("ArithmeticException");
                System.out.println(e.getClass().getName());
                try {
    //                b = 2;
                    result = a / b;
                } catch (ArithmeticException e2) {
                    System.out.println("ArithmeticException2");
                    System.out.println(e.getClass().getName());
                } finally {
                    System.out.println("catch문 안에 다시 try-catch");
                }
            } finally {
                System.out.println(result);
            }
        }
    }

    catch文の再試行-catchコードの結果

    ArithmeticException
    java.lang.ArithmeticException
    ArithmeticException2
    java.lang.ArithmeticException
    catch문 안에 다시 try-catch
    0

    throw


    throwはエラーが発生しない場合でも故意にエラーを引き起こす.
    次のコードは論理的にエラーはありませんが、故意にエラーが発生し、catchで作成されたコードを実行します.

    throwコード

    public class Main {
        public static void main(String[] args) {
            int a = 10;
            int b = 5;
            int result = 0;
    
            try {
                result = a / b;
                throw new ArithmeticException();
            } catch (ArithmeticException e) {
                System.out.println("ArithmeticException");
                System.out.println(e.getClass().getName());
            } finally {
                System.out.println(result);
            }
        }
    }

    throwコード結果

    ArithmeticException
    java.lang.ArithmeticException
    2

    throws


    throwsはthrowsとは違います.
    throwが故意にエラーを引き起こした場合、throwsはメソッド宣言子例外を宣言し、メソッドを使用するときにエラーが発生するかを通知します.
    throwsは異常処理とは無関係であり,この方法を用いる場合は直接異常処理を行う必要がある.

    throwsコード

    public class Main {
        public static void main(String[] args) throws IllegalAccessException, NullPointerException {
            String illegal = "throw IllegalAccessException";
            String nullPoint = "throw NullPointException";
    
            try {
                Main.testMethod(nullPoint);
            } catch(IllegalAccessError | NullPointerException e) {
                System.out.println(e.getClass().getName());
            }
        }
    
        public static void testMethod(String text) throws IllegalAccessException, NullPointerException {
            if(text.equals("throw IllegalAccessException")) {
                throw new IllegalAccessException("you throw IllegalAccessException");
            } else if(text.equals("throw NullPointException")) {
                throw new NullPointerException("you throw NullPointException");
            }
        }
    }
    catch文がtryで発生するエラーを予測するために、2つのオプションが与えられます.IllegalAccessErrorおよびNullPointerExceptionはJDK 1である7以上で|を使用し、1以上のエラーを同時に使用できます.

    throwsコード結果

    java.lang.NullPointerException

    Java Exception階層



    Javaでは、ExceptionがThrowableを継承し、ThrowableがObjectを継承します.
    ExceptionはRuntimeExceptionと他のExceptionクラスの2つのサブクラスに分けられます.
    RuntimeExceptionクラスを継承するサブクラスは,主に致命的な異常が発生しない異常からなる.
    したがって,try-catchを記述するよりも記述コードの方が重要なのは,コードの記述中にエラーが発生しないようにすることであり,Exceptionクラスに属するサブクラスに異常が発生する可能性のある構文に対しては逆異常処理を行うべきである.

    ExceptionとErrorの違いは?

  • エラー::予期せぬエラーがプロセスを強制的に終了する可能性があります.
  • Exception::ある程度の予測が可能なので、異常処理が可能です.
  • READ


    2021.05.06-最初のコンテンツの作成