Language

MethodHandles.TryFinally(MethodHandle, MethodHandle) メソッド

定義

try-finally ブロックでラップすることで、target メソッド ハンドルを調整するメソッド ハンドルを作成します。

[Android.Runtime.Register("tryFinally", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)]
public static Java.Lang.Invoke.MethodHandle? TryFinally(Java.Lang.Invoke.MethodHandle? target, Java.Lang.Invoke.MethodHandle? cleanup);
[<Android.Runtime.Register("tryFinally", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)>]
static member TryFinally : Java.Lang.Invoke.MethodHandle * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle

パラメーター

target
MethodHandle

実行が try ブロックにラップされるハンドル。

cleanup
MethodHandle

finally ブロックで呼び出されるハンドル。

返品

2 つの引数で構成される try-finally ブロックを具体化するメソッド ハンドル。

属性

注釈

try-finally ブロックでラップすることで、target メソッド ハンドルを調整するメソッド ハンドルを作成します。 別のメソッド ハンドル cleanup、 finally ブロックの機能を表します。 target ハンドルの実行中にスローされた例外は、cleanup ハンドルに渡されます。 cleanupハンドルが最初に例外をスローしない限り、例外は再スローされます。 cleanup ハンドルの実行から返される値は、try-finally ハンドルの実行の結果になります。

cleanup ハンドルには、1 つまたは 2 つの追加の先頭引数が渡されます。 1 つ目は、 target ハンドルの実行中にスローされる例外、または例外がスローされなかった場合に null です。 2 つ目は、 target ハンドルの実行の結果です。または、例外がスローされた場合は、必要な型の null、0、または false 値がプレースホルダーとして提供されます。 target ハンドルにvoid戻り値の型がある場合、2 番目の引数は存在しません。 (引数の型変換を除き、組み合わせ子は、nullまたはゼロの値を挿入することではなく、対応する逆説的な引数を省略することで、パラメーター リスト内のvoid値を表します)。

targetハンドルとcleanup ハンドルには、対応する引数と戻り値の型が同じである必要があります。ただし、cleanup ハンドルでは末尾の引数が省略される場合があります。 また、cleanup ハンドルには、1 つまたは 2 つの追加の先頭パラメーター (<ul><li>a Throwableが必要です。このパラメーターは、target ハンドル (存在する場合) によってスローされる例外を処理します。<li>a パラメーターは、target ハンドルの実行結果を伝達する、targetとcleanupの両方の戻り値の型と同じです。 targetがvoidを返す場合、このパラメーターは存在しません。 </ul>

結果のアダプターの擬似コードは次のようになります。 コードでは、 V は、 try/finally コンストラクトの結果の型、 A/a、クリーンアップによって使用される結果のハンドルへの引数の型と値、および B/b、クリーンアップによって破棄された結果のハンドルに対する引数の型を表します。 <blockquote>

{@code
            V target(A..., B...);
            V cleanup(Throwable, V, A...);
            V adapter(A... a, B... b) {
              V result = (zero value for V);
              Throwable throwable = null;
              try {
                result = target(a..., b...);
              } catch (Throwable t) {
                throwable = t;
                throw t;
              } finally {
                result = cleanup(throwable, result, a...);
              }
              return result;
            }
            }

</blockquote>

保存された引数 (擬似コード内のa... ) はターゲットの実行によって変更できないため、呼び出された場合は呼び出し元からクリーンアップに変更されずに渡されることに注意してください。

クリーンアップが常にスローされる場合でも、ターゲットとクリーンアップは同じ型を返す必要があります。 このようなスロークリーンアップを作成するには、適切な戻り値の型のメソッド ハンドルを作成するために、 #throwException throwExceptionを使用してクリーンアップ ロジックを作成します。

tryFinally例外を通常の戻り値に変換することはありません。 まれに、例外をそのように変換する必要がある場合は、まずターゲットを #catchException(MethodHandle, Class, MethodHandle) でラップして送信例外をキャプチャしてから、 tryFinallyでラップします。

cleanupの最初のパラメーター型は、より狭いサブタイプではなくThrowable宣言することをお勧めします。 これにより、 cleanup は常に、 target がスローするすべての例外で呼び出されます。 より狭い型を宣言すると、targetによってスローされた例外の型がcleanupの最初のパラメーター型に割り当てられない場合、try-finally ハンドルによってClassCastExceptionがスローされる可能性があります。 VirtualMachineError、LinkageError、RuntimeExceptionのさまざまな例外の種類は、原則としてほぼすべての種類のJavaコードによってスローされ、ClassCastExceptionの背後にある他のIOExceptionのみをキャッチする finally 句がスローされることに注意してください。

9 に追加されました。

Javaドキュメント。

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

適用対象