/ / try catch [duplicate]によるJava例外処理-java、return、finally

try catchを使用したJava例外処理[duplicate] - java、return、finally

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"の直後に実行されます。