public class ReturnValueFromTryCatchFinally
{
public static void main(String[] args)
{
System.out.println(methodReturningValue());
}
static String methodReturningValue()
{
String s = null;
try
{
s = "return value from try block";
return s;
}
catch (Exception e)
{
s = s + "return value from catch block";
return s;
}
finally
{
s = s + "return value from finally block";
// return s;
}
}
}
このプログラムを実行すると、「tryブロックからの戻り値」として出力が得られます。からコメントを削除した場合 finally
ブロック(return s;
)その後、出力「tryブロックからの戻り値、finallyブロックからの戻り値」を取得しています。
なぜ「tryブロックからの戻り値」と「tryブロックからの戻り値」と「finallyブロックからの戻り値」を出力しないのですか? try
ブロックしてから finally
.
回答:
回答№1の場合は3関数は2回返すことができません。1つの文字列または他の文字列を返します。両方を返すことはできません。
2つのうちの1つ return
ステートメントは「勝ち」、返されるものを決定します。テストからわかるように、 finally
ブロックには return
文からの戻り値をオーバーライドするステートメント try
ブロック。
もしあなたが「なぜ finally
ブロックは、 return
ステートメントはコメントアウトされています。 try
ブロックは戻り値を(仮に)「tryブロックからの戻り値」に設定します。それは ない 「の値に設定 s
、それが何であれ」。 s
後で finally
ブロックは、の戻り値をさかのぼって変更しません try
ブロック。既にロックされています。 finally
ブロックは、独自のブロックがある場合にのみ戻り値を変更できます return
ステートメント。
それが価値があるもののために、それは非常に、非常に悪い考えです finally
でブロック return
ステートメント。例外がスローされた場合、その例外を呼び出し元に伝播する必要があります。 A return
声明 try
例外がある場合、ブロックはスキップされますが、 finally
ブロックすると、無条件に実行され、例外が抑制されます。 入れないで return
の中に finally
.
回答№2の場合は0
いいえ、メソッドはのみを返します 一度。そして、finallyブランチは、内部の "return s"の直後に実行されます。