Mark Wielaard writes:
 > Hi Christian,
 > 
 > On Wed, 2006-03-01 at 11:15 +0100, Christian Thalinger wrote:
 > > The problem is around ResourceBundle.java:480, or better, at
 > > Class.java:1136.  As you can see, the class contructor throws a NPE, but
 > > ResourceBundle.tryBundle does only catch IllegalAccessException,
 > > InstantiationException and ClassNotFoundException.
 > > 
 > > The jikes rvm, which is the only classpath based JVM that can run dacapo
 > > xalan, has this code for Class.newInstance:
 > > 
 > >     // Run the default constructor on the it.
 > >     try {
 > >       VM_Reflection.invoke(defaultConstructor, obj, null);
 > >     } catch (Throwable e) {
 > >       InstantiationException ex = new InstantiationException();
 > >       ex.initCause(e);
 > >       throw ex;
 > >     }
 > > 
 > > So, every exception in the contructor is converted into an
 > > InstantiationException, which obviously is caught in
 > > ResourceBundle.tryBundle.
 > 
 > Aha. Now I understand the mauve test that Tom added for
 > Class.newInstance(). I don't have a working jikesrvm here, but jikesrvm
 > will fail this new test since it doesn't rethrow the exception from the
 > constructor invocation. (This might be our poor documentation, we should
 > clearly mention that we get an InvocationTargetException, then we unwrap
 > it and rethrow the original exception from the constructor.)
 > 
 > > I think we should handle that properly in GNU Classpath, as all VMs
 > > would have the same code here.
 > 
 > Looks like we should catch any exception thrown by the class constructor
 > in tryBundle() and treat it as if the initialization failed for that
 > ResourceBundle so we try the next one.
 > 
 > Does the dacapo xalan work for you with the following patch?
 > 
 > diff -u -r1.36 ResourceBundle.java
 > --- java/util/ResourceBundle.java       23 Oct 2005 17:04:46 -0000      1.36
 > +++ java/util/ResourceBundle.java       1 Mar 2006 10:59:59 -0000
 > @@ -476,9 +476,7 @@
 >         if (ResourceBundle.class.isAssignableFrom(rbClass))
 >           bundle = (ResourceBundle) rbClass.newInstance();
 >        }
 > -    catch (IllegalAccessException ex) {}
 > -    catch (InstantiationException ex) {}
 > -    catch (ClassNotFoundException ex) {}
 > +    catch (Throwable t) { /* Class initialization failed, no valid bundle. 
 > */ }

Are you sure about this?  Do you really want to catch
VirtualMachineError here?

Andrew.

Reply via email to