MethodHandle-必须被捕获或声明为抛出。为什么会出现这个错误?

Ant*_*t's 2 java exception

我有一个Java 7代码,正在其中与MethodHanlde一起。代码是:

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
class HelloWorldApp {
    public static  void main(String[] args) {
    MyMethodHandle obj = new MyMethodHandle();
    obj.getToStringMH();
    }
}

class MyMethodHandle {
    public String getToStringMH() {
        MethodHandle mh;
        String s ;
            MethodType mt = MethodType.methodType(String.class, char.class, char.class);
            MethodHandles.Lookup lk = MethodHandles.lookup();
        try {
            mh = lk.findVirtual(String.class, "replace", mt);
        } catch (NoSuchMethodException | IllegalAccessException mhx) {
            throw (AssertionError)new AssertionError().initCause(mhx);
        }
        try {
            s = (String) mh.invokeExact("daddy",'d','n');
        }
        catch(Exception e) {
            throw (AssertionError)new AssertionError().initCause(e);
        }
        System.out.println(s);
        return "works";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我编译这个:

javac HelloWorldApp.java
Run Code Online (Sandbox Code Playgroud)

我收到这样的错误:

HelloWorldApp.java:23: error: unreported exception Throwable; must be caught or declared to be thrown
            s = (String) mh.invokeExact("daddy",'d','n');
                                       ^
1 error
Run Code Online (Sandbox Code Playgroud)

我在哪里犯错?

Pet*_*rey 5

作为MethodHandle.invokeExact状态的Javadoc

public final Object invoke(Object... args) throws Throwable
Run Code Online (Sandbox Code Playgroud)

这意味着您猛扑或“扔”一个 Throwable

顺便说一句,因为这引发了一般性异常,

    try {
        s = (String) mh.invokeExact("daddy",'d','n');
    } catch(Throwable t) {
        throw new AssertionError(t);
    }
Run Code Online (Sandbox Code Playgroud)

就是用

    try {
        s = (String) mh.invokeExact("daddy",'d','n');
    } catch(Throwable t) {
        Thread.currentThread().stop(t); // avoids wrapping the true exception
    }
Run Code Online (Sandbox Code Playgroud)

如果您停止另一个线程,则在使用Thread.stop(t)时可能无法预测。如果将其扔给当前线程,则可以预测。

注意:您需要确保您的方法“抛出”正在调用的方法的适当检查异常,因为编译器无法确保确实如此。

  • 如[此处](http://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html)和[方法文档](http://docs.oracle.com/不推荐使用使用Thread.stop(Throwable)的javase / 7 / docs / api / java / lang / Thread.html#stop%28java.lang.Throwable%29),并且使用起来不安全。即使对于当前线程,其影响也是不可预测的-例如:_“它可能会用于生成目标线程不准备处理的异常(包括该线程无法针对此方法抛出的已检查异常) “ _ (3认同)