0
0

例外処理 try-with-resource文 / try-catch-finally文 / InputMismatchExceptionクラス

Posted at

例外処理とは

例外処理はプログラムを実行中に異常な事態が起きた時に、対処する場合に使う

障害の種類は3種類
1. エラー

javaの動作環境の問題など、プログラムでは対処できない致命的な状況を表す

2. 検査例外

例外処理が実装されたことをコンパイラがチェックする例外なので、実装する必要がある

3. 非検査例外

例外処理が実装されたことをコンパイラがチェックしない例外なので、実装するかは任意

Exceptionクラス
例外を処理するクラスの継承元となるクラス

Exceptionクラスの継承先は、

  • 非検査例外であるRuntimeExceptionクラスと、
  • 検査例外であるクラスの2つに分かれる 

参考URL

非検査例外とは
非検査例外は 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();
};

《実践してみる》

try-with-resource文 コード全文
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);

	}

}

《実行結果》
スクリーンショット 2024-02-19 9.46.37.png
おはようと入力後、Scannerが自動で閉じられている。


ここで、try-with-resource文自体の仕組みは理解できたけれど、Scannerに入力されるべき文字列以外、例えば数値などが入力されてもScannerは自動で閉じられてしまう。それを回避するにはtry-with-resource文だけでは無理。

スクリーンショット 2024-02-19 10.33.12.png

try-catch-finally文

《入力された値の型がプログラムが予想していた型と異なる場合》の例外処理はInputMismatchExceptionクラスが必要になる。
その場合、try-catch-finally文が必要になる。

try-catch-finally文

  • 例外処理の後に必ず行う処理がある場合は、finally文を使う
  • Scannerクラスで指定の型の値が入力されなかったとしても、必ずクローズは行わなければいけない。その場合、クローズ処理をfinally文に記載する。
try文
try{
    // 整数型の値の入力を取得する
    int input = scanner.nextInt();
    System.out.println(input);
    }
catch文
catch(InputMismatchException e){
    //整数型の入力ではなかった場合に行う処理
    System.out.println("整数の入力ではありません");
    }

最後に、

finally文
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 を、入力。
スクリーンショット 2024-02-19 10.55.24.png
文字を入力した場合。
InputMismatchExceptionが動いて例外処理が行なわれたけれど、
finally文のクローズ処理も実行されている。
スクリーンショット 2024-02-19 10.56.19.png

《まとめ》
try-with-resource文とtry-catch-finally文の使い分けがわかりました!他にも使いわけポイントが存在していると思うので、実際に触ってみて気づけたら追記します。

最後に例外処理のクラスはググればたくさんのわかりやすい記事があるので割愛。
例えば、A、B、Cの自分で決めた文字または値などの以外が入力された場合も例が処理は自作しないといけない。今の時点で私には難易度マックスなので学習を深めたらチャレンジしたいと思います!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0