Oh, that does seem to work...what an ugly hack. And actually, you can just use Object.class but cast the resulting return to void, and it works.
So basically, I do this: handler = MethodHandles.constant(Object.class, null) handler = MethodHandles.asType(void.class) handler = MethodHandles.dropArguments(0, Throwable.class, String.class) And then use that as the exception handler. It's not exactly the no-op I wanted, since it has the cast logic in there, but it's close enough. FWIW, I'm using this in the tests for invokebinder, for testing the tryFinally operation: public void testTryFinally3() throws Throwable { MethodHandle post = Binder .from(void.class, String[].class) .invokeStatic(MethodHandles.lookup(), BinderTest.class, "finallyLogic"); MethodHandle ignoreException = Binder .from(void.class, RuntimeException.class, String[].class) .drop(0, 2) .cast(Object.class) .constant(null); MethodHandle handle = Binder .from(void.class, String[].class) .tryFinally(post) .catchException(RuntimeException.class, ignoreException) .invokeStatic(MethodHandles.lookup(), BinderTest.class, "setZeroToFooAndRaise"); assertEquals(MethodType.methodType(void.class, String[].class), handle.type()); String[] stringAry = new String[1]; try { handle.invokeExact(stringAry); } catch (RuntimeException re) { assertTrue("should not have reached here", false); } assertEquals("foofinally", stringAry[0]); } invokebinder is my MethodHandle DSL, so I don't have to stand on my head while building MH chains :) https://github.com/headius/invokebinder - Charlie On Tue, Jan 24, 2012 at 1:07 AM, Noctarius <m...@noctarius.com> wrote: > Hi Charly, > > why not use Void and return null what behaves like using void as > the return type. > > Cheers > Chris > > Am 24.01.2012 08:01, schrieb Charles Oliver Nutter: >> I discovered a possible gap in the MethodHandles API. >> >> Say I want to create an exception handler that does nothing but >> ignore the exception. The target handle is a method that looks >> like this: >> >> void foo(String) >> >> I have my "target" handle pointing at foo. >> >> I want to catch all Throwable and ignore them, so I would build >> up a method handle chain that does the following (top-down) >> >> 1. receives arguments (Throwable, String) and returns void 2. >> drops both arguments 3. ??? >> >> There's no endpoint I can attach it to for a "no-op" void >> return. >> >> "constant" doesn't work because it returns a value, and >> explicitly forbids void return type. >> >> "identity" doesn't work because it returns a value and receives >> one argument. >> >> What I need here is something like MethodHandles.constant, but >> that takes no arguments and has a void return. >> MethodHandles.nop anyone? >> >> I could filterReturn, but I still would have to attach it to >> an external method...there's no way to create a filter that >> returns void entirely with method handles. >> >> Am I missing something? >> >> - Charlie _______________________________________________ >> mlvm-dev mailing list mlvm-dev@openjdk.java.net >> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev > > > -- > > > ############################## > # A Digital's Life # > ############################## > Nickname: Noctarius > Location: Germany > > Meet me at: > Ohloh: http://www.ohloh.net/accounts/noctarius > Web: http://www.noctarius.com > XMPP/Jabber: noctar...@jabber.ccc.de > _______________________________________________ > mlvm-dev mailing list > mlvm-dev@openjdk.java.net > http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev _______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev