8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

try-catch-finally 例外処理

Posted at

例外処理では、try-catch-finallyを使います。
catch句でreturnをした場合の挙動について気になったので、確認した結果を残しておきます。

##正常動作

###プログラム

main.java
public static void main(String[] args) {
	try {
		// try A
		System.out.println("Try A-1");
		try {
			// try B
			System.out.println("Try B");
		} catch (NullPointerException e) {
			System.out.println("Catch B:NullPointerException");
		} finally {
			System.out.println("finally B");
		}
		System.out.println("Try A-2");
	} catch (Exception e) {
		System.out.println("Catch A:Exception");
	} finally {
		System.out.println("finally A");
	}
}

###動作結果

Try A-1
Try B
finally B
Try A-2
finally A

上から順に処理が流れる。

##例外発生
try BでNullPointerExceptionが発生したとすると・・・

###プログラム

main.java
public static void main(String[] args) {
	try {
		// try A
		System.out.println("Try A-1");
		try {
			// try B
			System.out.println("Try B");
			// ここで例外発生!
			throw new NullPointerException();
		} catch (NullPointerException e) {
			System.out.println("Catch B:NullPointerException");
		} finally {
			System.out.println("finally B");
		}
		System.out.println("Try A-2");
	} catch (Exception e) {
		System.out.println("Catch A:Exception");
	} finally {
		System.out.println("finally A");
	}
}

###動作結果

Try A-1
Try B
Catch B:NullPointerException
finally B
Try A-2
finally A

例外をcatchしているので、この場合も上から処理が流れる。

##catch句でreturn
catch句でreturnをすると・・・

###プログラム

main.java
public static void main(String[] args) {
	try {
		// try A
		System.out.println("Try A-1");
		try {
			// try B
			System.out.println("Try B");
			// ここで例外発生!
			throw new NullPointerException();
		} catch (NullPointerException e) {
			System.out.println("Catch B:NullPointerException");
			// cacth句の中でreturn
			return;
		} finally {
			System.out.println("finally B");
		}
		System.out.println("Try A-2");
	} catch (Exception e) {
		System.out.println("Catch A:Exception");
	} finally {
		System.out.println("finally A");
	}
}

###動作結果

Try A-1
Try B
Catch B:NullPointerException
finally B
finally A

例外をcatchしたところでreturnしているので、catch以降の処理(Try A-2)は処理されない。
ただし、finallyは処理される。

##catchしていない別の例外発生
try BでNullPointerException以外の例外が発生すると・・・

###プログラム

main.java
public static void main(String[] args) {
	try {
		// try A
		System.out.println("Try A-1");
		try {
			// try B
			System.out.println("Try B");
			// ここでcatchしない例外発生!
			throw new RuntimeException();
		} catch (NullPointerException e) {
			System.out.println("Catch B:NullPointerException");
			return;
		} finally {
			System.out.println("finally B");
		}
		System.out.println("Try A-2");
	} catch (Exception e) {
		System.out.println("Catch A:Exception");
	} finally {
		System.out.println("finally A");
	}
}

###動作結果

Try A-1
Try B
finally B
Catch A:Exception
finally A

例外をcatchしていないので、例外はスルーされるがfinallyは処理される。

##まとめ
とにかく
finallyは、例えその前でreturnされていても処理される!

###余談
仕事でプログラムを書くときはとにかく例外処理を入れるようにしています。
ただ、むやみやたらと例外処理を入れている(「その例外本当に発生する???」という)ソースも見かけます。
そこらへんは、ちゃんと見極めてコーディングしたいですね。

8
12
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
8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?