-[Java] Exception Handling


プログラムの実行中にエラーが発生し、異常終了を招くことがあります.このような状況はプログラムが間違っているからです.
重要なプログラムが実行中に例外に遭遇し、応答できずに死んでしまうと、非常に恐ろしいことが起こります.
このようなエラーを防止するために、エラーをエラー処理として処理します.
誤りは大体3つに表現できる.
コンパイルエラー-コンパイルフェーズで発生したエラー。 ランタイムエラー-ランタイムのエラー。 論理エラー:実行が設計に適合していない場合、エラーが発生します。

すべてのエラーが例外的に処理できるわけではありません.
スタックオーバーフローやメモリ不足などのエラーでプログラムが正常に閉じるのを阻止できません.
ただし、上記でなければ、異常処理によりプログラムを正常に動作させることができる.

階層


例外処理は例外処理クラスとみなされ、Javaは実行時に発生する可能性のある例外とエラーを複数のクラスとして定義します.
例外クラスは、次の階層でオブジェクトを継承します.
Object
|--Throwable
|--|--Exception
|--|--|--RuntimeException
|--|--|--*
|--|--Error
|--|--|--OutOfMemoryError
|--|--|--*
Exceptionはエラー処理可能な例外であり、エラーは異常終了を阻止できないエラーである.

try - catch


実行中に発生した異常はtry-catch構文で処理できます.
tryブロックとcatchブロックからなり、tryに異常が発生した場合、catchは定義された論理処理に従い、プログラムは正常に実行されます.
try {
	throw new RuntimeException();
} catch(Exception e) {
	// 에러에 대한 처리 로직 블록
}
try-catch構文は重ねて使用できます.
1つの論理で2つ以上のエラー処理が必要な場合は、catchブロックの作成を次のように続行できます.

複数catchブロック


次に、子クラスClassCastExceptionをキャプチャするcatchブロックを示します.Exceptionではありません.したがって、Exception処理ブロックはClassCastExceptionを処理しません.△前はもうやったから、できないほうがいい.
try {
	// 수행하는 로직
} catch(ClassCastException ce) {
	// 클래스 형변환 예외에 대한 처리 로직
} catch(Exception e) {
	// Exception에 대한 처리 로직
}

例外メッセージ


異常が発生した場合、異常に関するメッセージを出力できます.
1.printStackTrace:異常発生時に呼び出されるスタック内のメソッドの情報と異常メッセージを画面に出力します.
2.getMessage:発生した例外クラスインスタンスに格納されたメッセージを取得できます.
try{
    System.out.println(0 / 0);
}catch (ArithmeticException ae) {
    System.out.println("예외 메세지: " +  ae.getMessage());
    ae.printStackTrace();
}
実行結果は次のとおりです.
System.out.println("예외 메세지: " +  ae.getMessage()):
예외 메세지: / by zero

ae.printStackTrace():
java.lang.ArithmeticException: / by zero
	at Main.main(Main.java:4)

異常をきたす


例外は論理の実行に伴って発生しますが、プログラマは特定の状況で特定の例外を発生する可能性があります.
たとえば、受信した関数要求パラメータが10未満の場合はRuntimeExceptionと呼ばれます.
newキーワードで例外インスタンスを作成したり、throwキーワードで例外を生成したりできます.
public class Main {
    public static void main(String[] args){
        test(5);
    }
    public static void test(int value) {
        try {
            if(value < 10) {
                throw new Exception("10미만은 허용하지 않습니다.");
            }
        }catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

finally


異常が発生するかどうかにかかわらず、実行しなければならない論理はfinallyを使用して実行できます.
たとえば、論理実行後に結果値を無条件に初期化する必要がある場合はfinallyを使用します.
public class Main {
    public static void main(String[] args) {
        test();
    }

    public static void test() {
        int result = 10;
        System.out.println(result);
        try{
            result = result / 5;
            System.out.println(result);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            result = 0;
        }
        System.out.println(result);
    }
}
最終出力結果の値は0です.
上記では異常は発生していませんが、異常が発生しても最後の出力結果の値は0です.

例外カスタム


前述したように、javaは複数の例外をクラスとして定義しています.
しかし,論理を記述する際には,論理に特別な例外が生じることが多い.
この場合、既存の例外クラスを継承してカスタム例外クラスを定義できます.
次のコードはsuper()を呼び出すときにエラーメッセージのみを送信します.
ただし文字列を受信するコンストラクション関数だけではないので、直接Exceptionに入って確認するのが良いです.
class CustomException extends RuntimeException {
	public CustomException() {
    		super("커스텀 예외 발생");
    	}
}
前述したように、Custom Exceptionインスタンスを作成し、例外が発生したときにそのインスタンスを放出します.
新しい例外クラスを作成するのではなく、既存の例外クラスをできるだけ利用します。 -ジャワの結晶

リファレンス
Javaのテンプレート(第3版)