キャッチ☆ザ☆例外 〜例外のスローとExceptionのサブクラス

(しばらくJava勉強メモになります)
Word君の例外処理について

まとめ

投げた例外はかならずキャッチしよー!

問題

「作成したWord君には例外処理対策がされていません。メニューの該当番号以外を入力した場合や番号以外を入力した場合の例外処理を記述してください。本例外を示すクラスとして、NoNullExceptionクラスを作成すること」

考察

  • A:数字以外:Integer.parseInt(str)でNumberFormatExceptionが発生
  • B:メニューの該当番号:1,2,3以外はエラー扱いにする

処理内容

A:数字以外:Integer.parseInt(str)でNumberFormatExceptionが発生
→「入力されたstrをint型にキャストして、proc()にわたす」部分をtry-catch処理

User.java

// 入力された数字を引数としてワード君へ
String str = br.readLine();
try {
	int no = Integer.parseInt(str);
	boo = wk.proc(no);
} catch (NumberFormatException e) {
	System.out.println("ちゃんと番号えらんでよ。");
}

B:メニューの該当番号:1,2,3以外はエラー扱いにする
→1-3でなかったらNoNullExceptionクラスの例外をスロー&キャッチする処理を、proc()内switchでメニュー処理を振り分ける前に追加

ミニマムに書くと…

WordKun.java
public boolean proc(int no) throws NoNullException, IOException{
boolean boo = true;

	// 1-3でなかった場合
	if(no < 1 | 3 < no){
		try{
			throw new NoNullException();			
		}catch (NoNullException e) {
			System.out.println("ちゃんと番号えらんでよ。");
		}
	} else {
	// 1-3 の場合各処理
		switch(no){
		case 1:
		(以下略)
		break;
		}
	}
}

もちろんおなじtry-catchにまとめる

User.java

// 入力された数字を引数としてワード君へ
String str = br.readLine();
try {
	int no = Integer.parseInt(str);
	boo = wk.proc(no);
} catch (NumberFormatException e) {
	System.out.println("ちゃんと番号えらんでよ。");
} catch (NoNullException e) {
	System.out.println("ちゃんと番号えらんでよ。");
}

さらにException1つまでまとめてキャッチしてもよいかも。

// 入力された数字を引数としてワード君へ
String str = br.readLine();
try {
	int no = Integer.parseInt(str);
	boo = wk.proc(no);
} catch (Exception e) {
	System.out.println("ちゃんと番号えらんでよ。");
}

わしがはまったところ

Exceptionのサブクラスとして作成したNoNullExceptionをスローする処理を考える。

  • A: catch(NoNullException, e)でキャッチ:OK
  • B: catch(Exception, e)でキャッチ:OK,スーパークラスでもキャッチ可能
  • C:Exceptionってデフォルト処理でしょ?書かなくてもキャッチされるのではないのか?

→例外ハンドラを記述しないでデフォルト処理にまわると、「finally処理実行→デフォルトエラー処理→終了」になって止まってしまう

まとめ

投げた例外はかならずキャッチしよー!

参考:Javaの道

http://www.javaroad.jp/java_exception2.htm
まんなかにある「例外の処理フロー」図がわかりやすいです。