Last update: 2016-10-20 (木) 11:25:11

Javaメモ/Exceptionでまとめて受けて判定
Tag: Java


以下のような戻り値を持つ関数があります。

public enum DetectKind {
	DetectOK,
	DetectChina,
	DetectChon,
}

public DetectKind detect() {
	DetectKind kind;
	int length = 9;

	switch ( length ) {
	case 10:
		kind = DetectKind.DetectChon;
	case 9:
		kind = DetectKind.DetectChina;
	default:
		kind = DetectKind.DetectOK;
		break;
	}

	return kind;
}

Javaっぽく戻り値を例外処理に置き換えると以下のようにthrowsに大量のExceptionを継承した例外クラスを並べることになります。

例外クラス定義

private class DetectException extends Exception {
	private static final long serialVersionUID = -1;
}

private class DetectChinaException extends DetectException {
	private static final long serialVersionUID = -1;
}

private class DetectChonException extends DetectException {
	private static final long serialVersionUID = -1;
}

関数定義

public void detect() throws DetectChinaException, DetectChonException {
	int length = 9;

	switch ( length ) {
	case 10:
		throw new DetectChinaException();
	case 9:
		throw new DetectChonException();
	default:
		break;
	}
}

呼出し部

public void test() {
	try {
		this.detect();
	} catch (DetectChinaException e) {
		e.printStackTrace();
	} catch (DetectChonException e) {
		e.printStackTrace();
	}
}

例外発生時の共通処理がある場合は以下のようにまとめてExceptionでまとめてcatchしたいですよね?

public void test() {
	try {
		this.detect();
	} catch (Exception e) {
		e.printStackTrace();

		// 共通処理
	}
}

でも、やっぱり何が起きたか知りたい。
そんなあなたに朗報。
Exceptionでまとめてcatchした後にinstanceofで判定すればいいんです。

以下のような場合に使えます。

  1. throwsに例外クラスを羅列したくない。
    throwsExceptionでまとめたい。
  2. Exceptionでまとめてcatchしたい。
  3. Exceptionでまとめてcatchした後に発生した例外クラスの種類を知りたい。

関数定義

private void detect() throws Exception {
	int length = 9;

	switch ( length ) {
	case 10:
		throw new DetectChinaException();
	case 9:
		throw new DetectChonException();
	default:
		break;
	}
}

呼出し部 (関数を経由しても判定できることも確認)

private void testwrap() throws Exception {
	this.detect();
}

public void test() {
	try {
		this.testwrap();
	} catch (Exception e) {
		e.printStackTrace();

		// 共通処理

		if ( e instanceof DetectException ) {
			System.out.println("Detect!!");
		} else {
			System.out.println("Not detect.");
		}
		if ( e instanceof DetectChonException ) {
			System.out.println("Detect Chon! Go home!!");
		} else {
			System.out.println("Not Chon.");
		}
		if ( e instanceof DetectChinaException ) {
			System.out.println("Detect China! Get out!!");
		} else {
			System.out.println("Not China.");
		}
	}
}

実行結果

Detect!!
Detect Chon! Go home!!
Not China.

コメント

コメントはありません。 コメント/Javaメモ/Exceptionでまとめて受けて判定?

お名前: