[Java] Chapter 18. 例外処理


📌18-1. JAva異常処理の基礎


プログラムにアクセスできる人にはプログラマーとユーザーがいます.
プログラマは使用中にエラーが発生する可能性があり、ユーザーが使用中に不適切な使用によってエラーが発生する可能性があります.
現在処理される例外は、通常、ユーザーの不適切な使用によるエラーです.
また、プログラマは、プログラマが望まない場合でもプログラムを実行できるという、珍しい場合にプログラミングを行わなければならない.これが例外処理である.
例外を通知するために存在するクラスがあります.
  • java.lang.ArithmeticException:数学演算でエラーが発生したことを示す異常類
  • java.util.InputMismatchException:Scannerクラスの異常クラス
  • 例外が発生した場合、JVMはクラスのインスタンスを作成し、通知します.

    やってみる~catch moon


    他の例外処理方法がない場合はif~else文で処理できますが、コード全体を表示する際にプロセスを一目で理解するのは難しいです.
    したがって,try~catch文である異常処理文を個別に区別することが望ましい.
    try {
        // 관찰 영역
    }
    catch {
        // 처리 영역
    
    }
    1つのcatch文では領域全体の異常を管理できないため、catch文が担当する領域をtry文で囲む.
    異常処理の流れを見てみましょう.
  • 異常発生
  • JVMの例外クラスインスタンス
  • try文が存在するかどうか
  • catch文のインスタンス転送
  • 異常処理完了
  • 例外処理が完了すると、対応するtry~catch文がスキップされます.
    また,JVMがtry文に入る速度が遅くなるため,try文で多くのコードを包むのは効率的ではない.
    したがって、try文で囲む領域を決定する必要があります.
    「ここで例外が発生した場合、残りのことは無効でスキップする必要があります」とタスクと見なし、try文でバンドルします.
    1つのtry文に2つ以上の例外が発生する可能性があります.
    // 방법 1
    
    try {
        ...
    }
    catch(ArithmeticException e) {
        ...
    }
    catch(InputMismatchException e) {
        ...
    }
    
    // 방법 2
    
    try {
        ...
    }
    catch(ArithmeticException | InputMismatchException e) {
        ...
    }

    変換可能クラス

    java.lang.Trowableクラスは、すべての例外クラスのトップクラスです.もちろん、このクラスはObjectクラスも継承します.
    Trowableクラスには2つの典型的な方法があります.
  • public String getMessage():異常原因を含む文字列を返す
  • public void printStackTrace():異常位置と呼び出し方法の情報が出力され、また理由が返されるため、通常はどちらかしか使用できません.

  • 例外発生ポイントで例外が処理されていない場合は、そのメソッドを呼び出す領域に例外が渡されます.
    以上のコードで異常が発生する可能性がある箇所はmd2メソッドです.しかしtry~catch文が存在しないため、異常を処理できない.
    したがって、md1methodで異常を処理する必要があるが、try~catch文mainmethodがないため、責任を移す.
    しかしmainMethodも例外を処理できないため、責任をJVMに転嫁する.
    JVMは、例外クラスインスタンスのprintStackTrace()を呼び出して終了します.

    以外の異常類

  • ArrayIndexOutOfBoundException
  • ClassCastException
  • NullPointerException
  • 📌18-2. 処理異常の残りの説明。


    異常クラスの区切り


    複数の例外クラスを次の3つに分類できます.
  • Errorクラスを継承する異常クラス
  • Exceptionクラスを継承する異常クラス
  • RuntimeExceptionクラスを継承する例外クラス
    :RuntimeExceptionクラスはExceptionクラスを継承します.
  • Errorクラスを継承する異常クラスの異常は,プログラム内,コードレベルの異常ではなく,システムエラーレベルの異常である.
    RuntimeExceptionクラスを継承する例外は、通常、コードエラーによって発生します.したがって,このタイプの異常の場合,コードの修正を考慮すべきである.

    ┑Exceptionクラス


    私たちが本当に例外と言える状況はExceptionクラスと定義されています.したがって,例外の扱い方を明確にしなければならない.コンパイルエラーが発生します.
    この場合の例外処理には2つの方法がある.
  • try~catch文
  • throws
  • 先のRuntimeExceptionクラスではtry~catch文がなければ呼び出しの方法は我々が担当するが,Exceptionクラスは我々が宣言しなければならない.

    プログラマ定義の例外クラス


    構文異常ではなく論理異常を考慮して、プログラマは例外クラスを作成することもできます.
    class AAA extends Exception {...}
    Exceptionクラスの継承は例外クラスの唯一の条件です.
    ageの値は0より小さく、クエリthrowに遭遇すると、JVMは例外処理メカニズムを実行します.また、JVMではなく例外クラスのインスタンスを作成する必要があります.throwsthrowを区別する必要があります.
    Exceptionクラスを間接的に継承することも例外クラスとなります.
    次の例外クラスを作成することを考えてみましょう.
    class FirstException extends Exception {...}
    class SecondException extends FirstException {...}
    class ThirdException extends SecondException {...}
    継承された概念によって、FirstExceptionは例外クラスとして作成された参照変数として3つの例外クラスを参照することができる.
    try {...}
    catch(FirstException e) {...}
    catch(SecondException e) {...}
    catch(ThirdException e) {...}
    ただし、このようにcatch文を構築すると、最初のcatch文はすべての例外の影響を受けるため、残りの2つのcatch文は機会を得ることができません.
    幸いなことに、コンパイラはこの部分にコンパイルエラーを提供しました.
    この問題を解決するにはcatch文の順序を変更する必要がある.
    try {...}
    catch(ThirdException e) {...}
    catch(SecondException e) {...}
    catch(FirstException e) {...}

    ✅finally


    コードの実行がtry文に入ると、finally文が無条件に実行されます.
    // 작성법 1
    try {...}
    finally {...}
    
    // 작성법 2
    try {...}
    catch(...) {...}
    finally {...}
    たとえば、ファイルの入出力では、ファイルが開くと閉じる必要があります.したがって、finally文にファイルを閉じるコードが含まれていると仮定します.

    しかし,クローズ中に例外が発生するためtry~catch文が出現する.これでコードが複雑になり、面白くなくなります.
    この問題を解決するために現れたのはtry-with-resourcesです.

    ファイルを含むリソースにはopen-closeの概念があるため,リソースを制御するためのコードとtryの組合せが作成される.writer参照インスタンスが自動再利用可能なインタフェースを実装している場合、try-with-resourcesを使用することができます.

    🔗カリキュラムとリソースソース


    Naver Cafe|尹聖祐のプログラミング学習グループ