語言

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 區塊中的 handle。

cleanup
MethodHandle

在 final 區塊中被調用的 handle。

傳回

一個包含 try-finally 由兩個參數組成的區塊的方法控制柄。

屬性

備註

製作一個方法代柄,透過將某個方法代柄包裹在try-finally區塊中來適配。target 另一個方法的 handle, cleanup代表該 finally 區塊的功能。 在執行 target handle 時拋出的任何例外都會傳給 handle。cleanup 例外會被重新拋出,除非 cleanup handle 先拋出例外。 從句柄執行中回傳 cleanup 的值將是該句柄執行 try-finally 的結果。

cleanup帳號會被傳遞一到兩個額外的引向參數。 第一種是在執行 target handle 時拋出的例外,或 null 是如果沒有拋出例外。 第二個是執行 target 該句柄的結果,若拋出例外,則 null提供所需型態的 、 、 或 false 值作為佔位符。 若 target handle 具有 void 回傳型別,則第二個參數不存在。 (請注意,除了參數型別轉換外,組合子 void 在參數列表中表示值時會省略對應的悖論參數,而非插入 null 或零值。)

target和 cleanup handle 必須有相同的對應參數與回傳類型,但 cleanup handle 可以省略尾隨參數。 此外,cleanup句柄必須有一到兩個額外的前導參數:<ul<>li>a Throwable,將攜帶柄拋出的target例外(若有的話);以及 <li>,與 和 的回傳類型targetcleanup相同類型的參數,將攜帶柄執行target的結果。 若返回 targetvoid,則不存在此參數。 </ul>

所產生的轉接器偽代碼如下。 在程式碼中,代表V結構的try/finally結果型別;aA/、、是被清理消耗的對結果句柄的參數型別與值;而 B/b,則是被清理時丟棄的結果句柄的參數。 <引用>

{@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;
            }
            }

</區塊引用>

請注意,儲存的參數(a... 偽程式碼中)無法透過目標執行修改,因此若被呼叫,則會不改變地從呼叫者傳遞給清理。

目標和清理必須回彈相同類型,即使清理總是投擲。 要建立這樣的拋出清理,將清理邏輯組合為 #throwException throwException,以建立正確回傳類型的方法句柄。

請注意,該系統 tryFinally 從未將例外轉換成正常退貨。 在罕見情況下,例外必須以此方式轉換,先將目標#catchException(MethodHandle, Class, MethodHandle)包裹以捕捉出出異常,然後再包裹 。tryFinally

建議先宣Throwable告第一個參數類型cleanup,而非較窄的子類型。 這樣可以確保 cleanup 無論拋出什麼例外 target ,都會被調用。 宣告較窄型別可能會導致 ,ClassCastExceptiontry-finally若 所target拋出的例外類型無法指派給 的cleanup第一個參數類型。 請注意,LinkageErrorRuntimeException原則上幾乎任何類型的 Java 程式碼都可以拋出各種例外類型VirtualMachineError,而只捕捉(例如)IOException的 final 子句會將其他例外都隱藏在 ClassCastException。

新增9。

的 java.lang.invoke.MethodHandles.tryFinally(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)Java 檔。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

適用於