A Clockwork …

~雑記メモ~

try-catch内でのreturn

try-catchは絶対使いますよね。
ただ、使い方を間違えると予想外の動きになってしまうことがあります。
それは、try-catchとreturnが混ざってしまった構文の場合です。

まずは次の例を見てみましょう。

	public int tryCatch(String str) {
		int i = 0;
		try {
			str.toString();
			return i + 1;
		} catch (NullPointerException ne) {
			return i - 1;
		} finally {
			return i;
		}
	}

さて、問題なのですが、
このメソッドtryCatchの引数strが"null"である場合と、そうでない場合でどういう結果になると思いますか?

答えはこうなります。

nullの場合は、

0

文字列の場合は、

0

正解でしたか?
今回の例では、どんな結果であっても"0"が返ります。

理由は、try-catch文にfinally句がある場合は、「必ず」finally句が実行されることが挙げられます。

finallyは、try文から正常系でも例外系でも抜けたら実行されます。
さらに、try文にreturnがあってもfinallyにreturnがあると、try文にあるretrunを上書きしてfinallyのretrunが実行されます。

つまり、finally内にreturnが存在している場合は、try文に存在しているreturnが意味を成さない物となってしまうのです。

こういった場合を避けるためにも、try-catch内はreturnを書くことは避けることが推奨されます。

ちなみに、このように書くと綺麗だと思います。

	public int tryCatch(String str) {
		int i = 0;
		try {
			str.toString();
			i += 1;
		} catch (NullPointerException ne) {
			i = -1;
		} finally {
			return i;
		}
	}

設計の場合ではなく、リファクタの場合でも発生するので注意して開発を進めてください。

本日は以上です。