MethodHandles.TryFinally(MethodHandle, MethodHandle) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
블록에 래핑하여 메서드 핸들을 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에 추가되었습니다.
이 페이지의 일부는 만들고 공유한 작업을 기반으로 하며 에 설명된 조건에 따라 사용됩니다.