Other |
---|
1.4.0 betaFixed |
Duplicate :
|
|
Duplicate :
|
|
Duplicate :
|
|
Duplicate :
|
|
Duplicate :
|
|
Duplicate :
|
|
Duplicate :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
Name: vrR10176 Date: 03/22/2001 Api spec says about method invoke (java.lang.reflect.Method): "public Object invoke(Object obj, Object[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException ... skip ... Control transfers to the invoked method. If the method completes abruptly by throwing an exception, the exception is placed in an InvocationTargetException and thrown in turn to the caller of invoke. ... skip ... Throws: InvocationTargetException - if the underlying method throws an exception. ... skip ..." And JVMS-2 says (chapter 2.16, Exceptions, p.40): "Every exception is represented by an instance of the class Throwable or one of its subclasses" Therefore, if the method completes abruptly by throwing LinkageError (for example NoSuchFieldError), this error should be placed in an InvocationTargetException and thrown in turn to the caller of invoke, as this error is exception and subclass of Throwable. But JVM (jdk1.4.0beta-b54,b55,b56) does not place LinkageError to InvocationTargetException and throws it immediately. This is jdk regression, all previous jdk throws InvocationTargetException instead of LinkageError. The bug affects a lot of jck vm tests. To reproduce the issue execute following test. Compile first test.java and then test2.java ------------ test.java ------------------------ package invoke_test; import java.lang.reflect.*; abstract class testA{ static int f; } class test1 extends testA{ static void run(){ f = 2; } } public class test { public static void main(String args[]) { try { Class test_class = Class.forName("invoke_test.test1"); Method runMethod = test_class.getDeclaredMethod("run", new Class[]{}); Object ignore = runMethod.invoke(null, new Object[]{}); } catch (InvocationTargetException e) { Throwable ee = e.getTargetException(); System.out.println("Exception " + e + " wraps: " + ee); System.out.println("Test passed"); } catch (Throwable e) { System.out.println("Failed with unexpected exception: " + e); } } } ------------ test2.java ------------------------ package invoke_test; abstract class testA{ } ------------ Logs ----------------------------- $ javac -d . test.java $ javac -d . test2.java $ java -version java version "1.4.0-beta" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta-b56) Java HotSpot(TM) Client VM (build 1.4-beta-B56, mixed mode) $ java -Xfuture invoke_test.test Failed with unexpected exception: java.lang.NoSuchFieldError: f ------------ Logs , some previous jdks---------- ----jdk1.4.0beta-b53---- $ java -version java version "1.4.0-beta" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta-b53) Java HotSpot(TM) Client VM (build 1.4beta-B53, mixed mode) $ java -Xfuture invoke_test.test Exception java.lang.reflect.InvocationTargetException wraps: java.lang.NoSuchFieldError: f Test passed ----jdk1.3.0fcsC---- $ java -version java version "1.3.0" Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0-C) Java HotSpot(TM) Client VM (build 1.3.0-C, interpreted mode) $java -Xfuture invoke_test.test Exception java.lang.reflect.InvocationTargetException wraps: java.lang.NoSuchFieldError: f Test passed ----jdk1.2fcsV---- $ java -version java version "1.2" Classic VM (build JDK-1.2-V, green threads, sunwjit) $ java -Xfuture invoke_test.test Exception java.lang.reflect.InvocationTargetException wraps: java.lang.NoSuchFieldError: invoke_test.testA: field f not found Test passed ----------------------------------------------- ====================================================================== Name: dkR10014 Date: 04/03/2001 This bug affects the following test from testbase_nsk: nsk/stress/except/except001 ======================================================================
|