2

MethodHanldeで遊んでいるJava 7コードがあります。コードは次のとおりです。

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";
    }
}

これをコンパイルすると:

javac HelloWorldApp.java

次のようなエラーが表示されます。

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

どこで間違いを犯していますか?

4

2 に答える 2

5

MethodHandle.invokeExactのJavadocが述べているように

public final Object invoke(Object... args) throws Throwable

これは、キャッチをマッシュするか、「投げる」ことを意味しますThrowable

ところで、これは一般的な例外をスローするので、

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

Throwableを再スローすることです

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

Thread.stop(t)を使用しているときに、別のスレッドを停止すると、予測できない場合があります。現在のスレッドに対してスローするかどうかは予測可能です。

注:コンパイラーはこれが当てはまることを保証できないため、呼び出しているメソッドに対して適切なチェック例外をメソッドが「スロー」することを確認する必要があります。

于 2012-07-29T08:02:11.990 に答える
1

invokeExact宣言されてthrows Throwableいます。Throwableしたがって、の代わりにキャッチする必要がありますException。(あんExceptionは一種類のみですThrowable。)

try {
    s = (String) mh.invokeExact("daddy",'d','n');
}
catch(Throwable t) {
    throw new AssertionError(t);
}
于 2012-07-29T07:59:49.180 に答える