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

在最后一个块中调用的句柄。

返回

一个方法句柄,表示 try-finally 由两个参数组成的块。

属性

注解

创建一个方法句柄,该句柄通过将方法句柄包装在块中try-finally来调整target方法句柄。 另一个方法句柄 cleanup表示块的功能 finally 。 在执行 target 句柄期间引发的任何异常都将传递给 cleanup 句柄。 除非 cleanup 句柄先引发异常,否则将重新引发异常。 从 cleanup 句柄的执行返回的值将是句柄执行 try-finally 的结果。

cleanup 柄将传递一两个额外的前导参数。 第一个是执行句柄期间引发的 target 异常,或者 null 未引发异常。 第二个是句柄执行 target 的结果,或者,如果它引发异常、必需类型的零 nullfalse 值作为占位符提供。 如果 target 句柄具有返回类型,则第二个 void 参数不存在。 (请注意,除参数类型转换外,组合器通过省略相应的自变量参数而不是插入null或零值来表示void参数列表中的值。

targetcleanup柄必须具有相同的相应参数和返回类型,但cleanup句柄可能省略尾随参数。 此外,cleanup句柄必须具有一个或两个额外的前导参数:<ul><li>aThrowable,该参数将携带句柄引发targettarget异常(如果有); 和 <li>一个与两者targetcleanup返回类型的参数相同,这将承载句柄执行的结果。 如果返回voidtarget则此参数不存在。 </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

建议声明Throwable第一个参数类型,而不是更窄的cleanup子类型。 这可确保 cleanup 始终使用引发的任何异常 target 调用。 如果由句柄引发的异常target类型不可分配给第一个参数类型cleanup,则声明较窄的类型可能会导致ClassCastException句柄引发try-finally。 请注意,各种异常类型VirtualMachineErrorLinkageError原则上RuntimeException可由几乎任何类型的Java代码引发,最后一个捕获(say)的子句只会IOException掩码后面ClassCastException的任何其他子句。

已在 9 中添加。

Java文档java.lang.invoke.MethodHandles.tryFinally(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)

本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。

适用于