언어

MethodHandles.TryFinally(MethodHandle, MethodHandle) 메서드

정의

블록에 래핑하여 메서드 핸들을 target 조정하는 메서드 핸들을 만듭니다 try-finally .

[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 하는 메서드 핸들입니다.

특성

설명

블록에 래핑하여 메서드 핸들을 target 조정하는 메서드 핸들을 만듭니다 try-finally . 블록의 기능을 나타내는 또 다른 메서드 핸들 cleanup입니다 finally . 핸들을 실행하는 동안 throw된 예외는 target 핸들에 cleanup 전달됩니다. 핸들이 예외를 먼저 throw하지 않는 한 cleanup 예외가 다시 throw됩니다. 핸들의 실행에서 cleanup 반환되는 값은 핸들 실행의 try-finally 결과입니다.

핸들은 cleanup 하나 또는 두 개의 추가 선행 인수를 전달합니다. 첫 번째는 핸들을 실행하는 동안 throw된 예외이거나 target 예외가 null throw되지 않은 경우입니다. 두 번째는 핸들 실행의 target 결과이거나 예외를 throw null하는 경우 필요한 형식의 값, 0 또는 false 값이 자리 표시자로 제공됩니다. 핸들에 반환 형식이 target 있으면 두 번째 인수가 void 없습니다. (인수 형식 변환을 제외하고 결합자는 삽입 void 또는 0 값이 아니라 해당 역설적 인수를 생략하여 매개 변수 목록의 값을 나타냅니다null.)

target 핸들은 cleanup 후행 인수를 생략할 수 있다는 점을 cleanup 제외하고 해당 인수 및 반환 형식이 같아야 합니다. 또한 핸들에는 cleanup 하나 또는 두 개의 추가 선행 매개 변수인< ul><li>aThrowable가 있어야 합니다. 이 매개 변수는 핸들에 의해 target throw된 예외(있는 경우)를 전달하고, 둘 다 < 의 반환 형식과 >동일한 형식의 매개 변수를 반환target하며cleanup, 이는 핸들 실행 target 의 결과를 전달합니다. 반환target되는 경우 이 매개 변수가 void 없습니다. </ul>

결과 어댑터의 의사 코드는 다음과 같습니다. 코드에서 구문Vtry/finallyA의 / 결과 형식, 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... 의사 코드)는 대상을 실행하여 수정할 수 없으므로 호출자가 호출된 경우 정리에 변경되지 않고 전달됩니다.

정리가 항상 throw되더라도 대상 및 정리는 동일한 형식을 반환해야 합니다. 이러한 throw 정리를 만들려면 올바른 반환 형식의 메서드 핸들을 만들기 위해 정리 논리 #throwException throwException를 작성합니다.

tryFinally 예외를 일반 반환으로 변환하지 않습니다. 예외를 이러한 방식으로 변환해야 하는 드문 경우에서는 먼저 대상 #catchException(MethodHandle, Class, MethodHandle) 을 래핑하여 나가는 예외를 캡처한 다음 래핑합니다 tryFinally.

더 좁은 하위 형식이 아닌 첫 번째 매개 변수 형식 cleanup 을 Throwable 선언하는 것이 좋습니다. 이렇게 하면 cleanup throw되는 예외 target 를 제외하고 항상 호출됩니다. 더 좁은 형식을 선언하면 throw된 예외의 형식을 첫 번째 매개 변수 형식ClassCastException에 할당할 수 없는 경우 핸들에 의해 try-finallytarget throw될 수 있습니다cleanup. 다양한 예외 형식은 VirtualMachineErrorLinkageError원칙적으로 RuntimeException 거의 모든 종류의 Java 코드에 의해 throw될 수 있으며, (말) catch하는 최종 절은 뒤에 IOException있는 다른 모든 예외 형식만 ClassCastException 마스킹합니다.

9에 추가되었습니다.

에 대한 java.lang.invoke.MethodHandles.tryFinally(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)Java 설명서

이 페이지의 일부는 만들고 공유한 작업을 기반으로 하며 에 설명된 조건에 따라 사용됩니다.

적용 대상