Mark Wielaard wrote: > On Wed, 2006-03-01 at 10:15 -0800, David Daney wrote: > >>Andrew Haley wrote: >> >>>Mark Wielaard writes: >>> > 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? >> >>Or ThreadDeath, or OutOfMemoryError, or StackOverflowError, or ... >> >>Well maybe some of those, but why not just catch those documented in >>Class.newInstance() and Class.forName()? Namely add LinkageError and >>ExceptionInInitializerError. Or maybe Exceptions in general but no >>Errors others than those explicitly documented. > > > No I wasn't sure :) I just wanted to provide Christian with a quick and > dirty patch to make sure treating exceptions thrown from a constructor > as failed initialization of a ResourceBundle class was the thing that > was going wrong. Jeroen did more testing and fixed it by just catching > Exception. Unfortunately Class.newInstance() isn't guaranteed to wrap > exceptions (even declared exceptions) thrown from the default > constructor in an ExceptionInInitializer. Although that is what JikesRVM > does, but that is a bug in JikesRVM - a bug that helped counter this bug > it seems :) > We cannot violate the JLS! A method that throws a checked exception without declaring it is a bug. If Class.newInstance() throws a checked exception other than those that it declares, it is a bug. We cannot violate the JLS for any reason, not even to mimic bugs in other runtimes. My reading of the specification is: If the constructor throws an exception Class.newInstance must throw InstantiationException. If the Class static initializer throws then ExceptionInInitializerError. By catching all declared Errors and Exceptions, we should be safe. If we are not, then we should fix Class.newInstance(). David Daney.