例外処理とは
例外処理はプログラムを実行中に異常な事態が起きた時に、対処する場合に使う
障害の種類は3種類
1. エラー
javaの動作環境の問題など、プログラムでは対処できない致命的な状況を表す
2. 検査例外
例外処理が実装されたことをコンパイラがチェックする例外なので、実装する必要がある
3. 非検査例外
例外処理が実装されたことをコンパイラがチェックしない例外なので、実装するかは任意
Exceptionクラス
例外を処理するクラスの継承元となるクラス
Exceptionクラスの継承先は、
- 非検査例外であるRuntimeExceptionクラスと、
- 検査例外であるクラスの2つに分かれる
非検査例外とは
非検査例外は RuntimeExceptionクラス配下の例外クラスが対象になります。
非検査例外は try-catchが必要ないため、「非」検査例外と言われます。
非検査例外は正しいプログラムを書くことで回避することのできる例外です。
検査例外とは
検査例外は try-catchが必要な例外のため検査例外と言われます。
catch しなければ、コンパイルエラーが発生するため、例外ハンドリングが必須になります。
IOException(入出力関係の例外)
SQLException(DB系の例外)
ClassNotFoundException(クラスが見つからない)
try-with-resource文
通常のtry-catch文であれば、try文の前にScannerクラスのオブジェクトを生成しておき、try文の中には確認したい処理内容を書く。
Scanner scanner = new Scanner(System.in)
try{//確認したい処理の内容を書く
input = scanner.next();
}
一方で、try-with-resource文の場合は下記のようにtry文の中で、リソースとなるScannerクラスのオブジェクトを生成する。
その続きにtry文に確認させたい処理内容を書く。
そうすることで、その処理が終了したら自動的にクローズされる。
try-catch-finally文で書くこともできるが、try-with-resource文だとクローズ処理の記述を省略できるしコードも短く書ける。
try(Scanner scanner = new Scanner(System.in)) {
//入力した内容を確認する
input = scanner.next();
};
《実践してみる》
import java.util.Scanner;
public class Exception_Test4 {
public static void main(String[] args) {
System.out.println("入力しましょう");
String input = null;
try(Scanner scanner = new Scanner(System.in)) {
input = scanner.next();
};
System.out.println(input);
}
}
《実行結果》
おはようと入力後、Scannerが自動で閉じられている。
ここで、try-with-resource文自体の仕組みは理解できたけれど、Scannerに入力されるべき文字列以外、例えば数値などが入力されてもScannerは自動で閉じられてしまう。それを回避するにはtry-with-resource文だけでは無理。
try-catch-finally文
《入力された値の型がプログラムが予想していた型と異なる場合》の例外処理はInputMismatchException
クラスが必要になる。
その場合、try-catch-finally文が必要になる。
try-catch-finally文
- 例外処理の後に必ず行う処理がある場合は、finally文を使う
- Scannerクラスで指定の型の値が入力されなかったとしても、必ずクローズは行わなければいけない。その場合、クローズ処理をfinally文に記載する。
try{
// 整数型の値の入力を取得する
int input = scanner.nextInt();
System.out.println(input);
}
catch(InputMismatchException e){
//整数型の入力ではなかった場合に行う処理
System.out.println("整数の入力ではありません");
}
最後に、
finally{
System.out.println("Scannerクラスのオブジェクトをクローズします");
scanner.close();
}
import java.util.InputMismatchException;
import java.util.Scanner;
public class Exception_Test2 {
public static void main(String[] args) {
System.out.println("整数を入力しましょう");
// Scannerクラスのオブジェクト作成
Scanner scanner = new Scanner(System.in);
try {
//整数型の値の入力を取得する
int input = scanner.nextInt();
System.out.println(input);
} catch(InputMismatchException e) {
//整数型の入力ではなかった場合に行う処理
System.out.println("整数の入力ではありません");
}finally {
System.out.println("Scannerクラスのオブジェクトをクローズします");
scanner.close();
}
System.out.println("処理終了です");
}
}
《実行結果》
整数 9 を、入力。
文字を入力した場合。
InputMismatchException
が動いて例外処理が行なわれたけれど、
finally文のクローズ処理も実行されている。
《まとめ》
try-with-resource文とtry-catch-finally文の使い分けがわかりました!他にも使いわけポイントが存在していると思うので、実際に触ってみて気づけたら追記します。
最後に例外処理のクラスはググればたくさんのわかりやすい記事があるので割愛。
例えば、A、B、Cの自分で決めた文字または値などの以外が入力された場合も例が処理は自作しないといけない。今の時点で私には難易度マックスなので学習を深めたらチャレンジしたいと思います!