--- old/src/java.base/share/classes/java/lang/invoke/MethodHandles.java 2016-01-14 12:17:31.000000000 +0100 +++ new/src/java.base/share/classes/java/lang/invoke/MethodHandles.java 2016-01-14 12:17:31.000000000 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -3120,6 +3120,8 @@ MethodHandle handler) { MethodType ttype = target.type(); MethodType htype = handler.type(); + if (!Throwable.class.isAssignableFrom(exType)) + throw new ClassCastException(exType.getName()); if (htype.parameterCount() < 1 || !htype.parameterType(0).isAssignableFrom(exType)) throw newIllegalArgumentException("handler does not accept exception type "+exType); --- /dev/null 2016-01-14 12:17:33.000000000 +0100 +++ new/test/java/lang/invoke/8147078/Test8147078.java 2016-01-14 12:17:33.000000000 +0100 @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8147078 + * @run testng/othervm -ea -esa Test8147078 + */ + +import org.testng.annotations.Test; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; + +import static java.lang.invoke.MethodType.methodType; + +import static org.testng.AssertJUnit.*; + +public class Test8147078 { + + static int target(int x) { + throw new RuntimeException("ieps"); + } + + static int handler(String s, int x) { + return 4*x; + } + + static final MethodHandle MH_target; + static final MethodHandle MH_handler; + static final MethodHandle MH_catchException; + + static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + + static { + try { + Class C = Test8147078.class; + MH_target = LOOKUP.findStatic(C, "target", methodType(int.class, int.class)); + MH_handler = LOOKUP.findStatic(C, "handler", methodType(int.class, String.class, int.class)); + MH_catchException = LOOKUP.findStatic(MethodHandles.class, "catchException", + methodType(MethodHandle.class, MethodHandle.class, Class.class, MethodHandle.class)); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + } + + @Test + public void testNoExceptionType() { + boolean caught = false; + try { + MethodHandle eek = (MethodHandle) MH_catchException.invoke(MH_target, String.class, MH_handler); + } catch (ClassCastException cce) { + assertEquals("java.lang.String", cce.getMessage()); + caught = true; + } catch (Throwable t) { + fail("unexpected exception caught: " + t); + } + assertTrue(caught); + } + +} \ No newline at end of file