例外


例外とは?


例外とは?ユーザの誤った操作や開発者の誤った符号化によるプログラムエラーを指す.異常が発生した場合、プログラムはすぐに終了します.ただし、異常処理を行うことにより、プログラムを終了することなく他の動作を実行させることができる.

Exceptionのタイプ


checked exception


公式文書によると、ExceptionとそのサブクラスはThrowableのサブクラスであり、合理的なアプリケーションであれば、キャプチャしたい条件を示すという.
つまり、例外が発生してプログラムエラーが発生した場合、Exceptionを発生させるための条件が明示されます.
RuntimeExceptionを除き、すべてのサブクラスとExceptionクラスがchecked exceptionとして表示されます.メソッドまたは作成者の実行によって、checked exceptionがこの範囲外に投げ出されたり、渡されたりする可能性がある場合は、checked exceptionは、メソッドまたは作成者のthrowsセクションで宣言する必要があります.
すなわち、例外が発生した場合は、throwセクションでexception classを指定して例外を除外する必要があります.

unchecked exception


RuntimeExceptionは、JVMの実行中に発生します.
次にRuntimeExceptionとそのサブクラスをunchecked exceptionとして表します.checked exceptionとは逆に、異常が発生した場合、異常を排除する必要はありません.

一般的なunchecked exceptionタイプ


NullPointerException


インスタンスの参照値にnullが含まれている場合.使用時に発生します.

IndexOutOfBoundsException


配列でインデックス範囲外を使用すると発生します.

NumberFormatException


文字列を数値に変換する過程で、数値に変換できない文字列が含まれている場合に発生します.

ClassCastException


このような状況は、リレーションシップのクラス間変換タイプを継承/実装するのではなく、クラス間でタイプを変換する場合に発生します.

例外処理コード


例外がある場合は、どのように処理しますか?通常try-catch-finallyブロックが使用されます.上図のように、catch文内に異常が発生した場合、実行するコードを入力すればよい.
try {
     StringBuilder sb = null;
     System.out.println(sb.toString());
}

catch(NullPointerException e){
     System.out.println("NullPointerException 발생!!");
}

finally{
     System.out.println("---end---");
}
したがって、上記のコードを作成すると、
NullPointerException 발생!!
---end---
このような結果値が出力されます.

catch文の使用


try-catch-finallyブロックは、異なる例外に対して適切な処理をそれぞれ指定するために、複数のcatch文を宣言することができる.しかし、ここには注意すべき点があります.
catch文は上から順番に実行されます.親クラスのExceptionが一番上にある場合は、出産クラスのExceptionでも上のcatch文に引っかかり、次のcatch文に到達できません.したがって、次のコードに示すように、子->親順にExceptionを出す順序でなければなりません.
1つのcatch文で複数の例外を処理することもできます.処理する異常を|で括って表記すればよい.
try {
     StringBuilder sb = null;
     System.out.println(sb.toString());
}

catch(NullPointerException | IndexOutOfBoundsException e){
     System.out.println("NullPointerException or IndexOutOfBoundsException 발생!!");
}

catch(Exception e){
     System.out.println("Exception 발생!!");
}

finally{
     System.out.println("---end---");
}

リソースを自動的に閉じる


try-with-resourcesを使用して、使用したリソースオブジェクトを自動的に閉じます.
これはどういう意味ですか.既存のtry-catch-fianly構文では、finallyブロックで使用されるリソースオブジェクト(ストリーム、ソケットなど)がfinallyブロックでclose()でリソースを管理しています.closeメソッドも例外処理を行う必要があるため、finallyブロックにtry-cath-finally文が再入力されます.
しかしtry-with-resourcesはこのような面倒さとコードの乱れたタスクを減らした.
try(FileInputStream fis = new FileInputStream("file.txt")) {
...
}

catch(IOException e){
...
}
これで逆にfinallyブロックを取り除くことができます.tryブロックの実行が完了したり、異常が発生したりした場合、closeメソッドが自動的に呼び出され、catchまたはfinallyブロックが実行されます.

活用throw節


throwは例外を排除するための構文です.try-catch-finallyのように異常を直接処理するのではなく,メソッドやジェネレータを呼び出した場所で処理させる.
たとえば、マスターメソッドがAメソッドを呼び出すと、例外が発生します.このとき,A法はこの例外を投げ出した.この場合、この例外はmainメソッドで処理する必要があります.ではmainメソッドで投げるとどうなりますか?この場合、JVMは最終的に例外を処理し、コンソールに例外情報を書き込みます.

public static void main(String[] args) throws ClassNotFoundException {
	findClass();
}

public static void findClass() throws ClassNotFoundException {
	Class cls = Class.forName("java.lang.String2");
}