You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by "Senaka Fernando (JIRA)" <ji...@apache.org> on 2008/07/20 00:53:31 UTC
[jira] Commented: (HARMONY-1187) [classlib][text] unexpected
MissingResourceException for new DecimalFormat("#######0.0000")
[ https://issues.apache.org/jira/browse/HARMONY-1187?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12615058#action_12615058 ]
Senaka Fernando commented on HARMONY-1187:
------------------------------------------
Hi all,
As of today I get (Linux system),
Uncaught exception in main:
java.lang.ClassCastException: MyURLConnection
at java.net.URLClassLoader.createURLJarHandler(URLClassLoader.java:1035)
at java.net.URLClassLoader.makeNewHandler(URLClassLoader.java:997)
at java.net.URLClassLoader.getHandler(URLClassLoader.java:980)
at java.net.URLClassLoader.findResourceImpl(URLClassLoader.java:964)
at java.net.URLClassLoader$5.run(URLClassLoader.java:937)
at java.net.URLClassLoader$5.run(URLClassLoader.java:1)
at java.security.AccessController.doPrivilegedImpl(AccessController.java:171)
at java.security.AccessController.doPrivileged(AccessController.java:64)
at java.net.URLClassLoader.findResource(URLClassLoader.java:939)
at java.lang.ClassLoader$BootstrapLoader.findResource(ClassLoader.java:777)
at java.lang.ClassLoader.getResource(ClassLoader.java:209)
at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:215)
at com.ibm.icu.impl.ICUData.getStream(ICUData.java:70)
at com.ibm.icu.impl.ICUData.getStream(ICUData.java:79)
at com.ibm.icu.impl.ICUResourceBundleReader.getReader(ICUResourceBundleReader.java:190)
at com.ibm.icu.impl.ICUResourceBundle.createBundle(ICUResourceBundle.java:843)
at com.ibm.icu.impl.ICUResourceBundle.instantiateBundle(ICUResourceBundle.java:751)
at com.ibm.icu.impl.ICUResourceBundle.getBundleInstance(ICUResourceBundle.java:719)
at com.ibm.icu.util.UResourceBundle.getRootType(UResourceBundle.java:465)
at com.ibm.icu.util.UResourceBundle.instantiateBundle(UResourceBundle.java:513)
at com.ibm.icu.util.UResourceBundle.getBundleInstance(UResourceBundle.java:137)
at com.ibm.icu.util.UResourceBundle.getBundleInstance(UResourceBundle.java:217)
at com.ibm.icu.text.DecimalFormatSymbols.initialize(DecimalFormatSymbols.java:661)
at com.ibm.icu.text.DecimalFormatSymbols.<init>(DecimalFormatSymbols.java:59)
at java.text.DecimalFormat.<init>(DecimalFormat.java:80)
at test.main(test.java:12)
I see that the issue is related to this portion of code in working_classlib/modules/luni/src/main/java/java/net/URLClassLoader.java
1034 try {
1035 URL jarURL = ((JarURLConnection) url
1036 .openConnection()).getJarFileURL();
1037 JarURLConnection juc = (JarURLConnection) new URL(
1038 "jar", "", //$NON-NLS-1$ //$NON-NLS-2$
1039 jarURL.toExternalForm() + "!/").openConnection(); //$NON-NLS-1$
1040 JarFile jf = juc.getJarFile();
1041 URLJarHandler jarH = new URLJarHandler(url, jarURL, jf, prefixName);
1042 if (jarH.getIndex() == null) {
1043 try {
1044 Manifest manifest = jf.getManifest();
1045 if (manifest != null) {
1046 String classpath = manifest.getMainAttributes().getValue(
1047 Attributes.Name.CLASS_PATH);
1048 if (classpath != null) {
1049 searchList.addAll(0, getInternalURLs(url, classpath));
1050 }
1051 }
1052 } catch (IOException e) {
1053 }
1054 }
1055 return jarH;
1056 } catch (IOException e) {
1057 }
We are not checking the class type before we cast (line 1035). I believe that RI handles this properly :)...
However if we are to use a modified version of test.java as,
=====================================================
import java.net.*;
import java.text.DecimalFormat;
import java.io.IOException;
import java.util.jar.JarFile;
public class test {
public static void main(String[] args) {
URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory() {
public URLStreamHandler createURLStreamHandler(String protocol) {
return new MyURLStreamHandler();
}
});
System.out.println("res = " + new DecimalFormat("#######0.0000"));
}
}
class MyURLJarConnection extends JarURLConnection {
public MyURLJarConnection(URL u) throws MalformedURLException {
super(u);
}
public JarFile getJarFile() {
<<<< INSERT LOGIC HERE >>>>
}
public void connect() {
}
}
class MyURLStreamHandler extends URLStreamHandler {
protected MyURLStreamHandler() {
super();
}
protected URLConnection openConnection(URL u) throws IOException {
return new MyURLJarConnection(u);
}
protected void parseURL(URL u, String spec, int start, int limit) {
super.parseURL(u, spec, start, limit);
}
protected void setURL(URL u, String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref) {
super.setURL(u, protocol, host, port, authority, userInfo, path, query, ref);
}
}
=====================================================
we should be able to sort this. However, I still couldn't figure out the exact logic required. Please also note that I have not included the deprecated "protected void setURL(URL u, String protocol, String host, int port, String file, String ref)".
If you simply replace <<<< INSERT LOGIC HERE >>>> with "return null;" the exception would change to,
java.lang.NullPointerException
at java.net.URLClassLoader$URLJarHandler.<init>(URLClassLoader.java:315)
at java.net.URLClassLoader.createURLJarHandler(URLClassLoader.java:1041)
at java.net.URLClassLoader.makeNewHandler(URLClassLoader.java:997)
at java.net.URLClassLoader.getHandler(URLClassLoader.java:980)
at java.net.URLClassLoader.findResourceImpl(URLClassLoader.java:964)
at java.net.URLClassLoader$5.run(URLClassLoader.java:937)
at java.net.URLClassLoader$5.run(URLClassLoader.java:1)
at java.security.AccessController.doPrivilegedImpl(AccessController.java:171)
at java.security.AccessController.doPrivileged(AccessController.java:64)
at java.net.URLClassLoader.findResource(URLClassLoader.java:939)
at java.lang.ClassLoader$BootstrapLoader.findResource(ClassLoader.java:777)
at java.lang.ClassLoader.getResource(ClassLoader.java:209)
at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:215)
at com.ibm.icu.impl.ICUData.getStream(ICUData.java:70)
at com.ibm.icu.impl.ICUData.getStream(ICUData.java:79)
at com.ibm.icu.impl.ICUResourceBundleReader.getReader(ICUResourceBundleReader.java:190)
at com.ibm.icu.impl.ICUResourceBundle.createBundle(ICUResourceBundle.java:843)
at com.ibm.icu.impl.ICUResourceBundle.instantiateBundle(ICUResourceBundle.java:751)
at com.ibm.icu.impl.ICUResourceBundle.getBundleInstance(ICUResourceBundle.java:719)
at com.ibm.icu.util.UResourceBundle.getRootType(UResourceBundle.java:465)
at com.ibm.icu.util.UResourceBundle.instantiateBundle(UResourceBundle.java:513)
at com.ibm.icu.util.UResourceBundle.getBundleInstance(UResourceBundle.java:137)
at com.ibm.icu.util.UResourceBundle.getBundleInstance(UResourceBundle.java:217)
at com.ibm.icu.text.DecimalFormatSymbols.initialize(DecimalFormatSymbols.java:661)
at com.ibm.icu.text.DecimalFormatSymbols.<init>(DecimalFormatSymbols.java:59)
at java.text.DecimalFormat.<init>(DecimalFormat.java:80)
at test.main(test.java:12)
As you see it has now gone six lines further. Therefore, IMHO, I believe that the solution to such a problem would be to adopt the default behavior if an exception occurs... WDYT?
Also, spark, this is not a non-bug situation :), there is a bug for certain at line 1035.
Regards,
Senaka
> [classlib][text] unexpected MissingResourceException for new DecimalFormat("#######0.0000")
> -------------------------------------------------------------------------------------------
>
> Key: HARMONY-1187
> URL: https://issues.apache.org/jira/browse/HARMONY-1187
> Project: Harmony
> Issue Type: Bug
> Components: Classlib
> Reporter: Vladimir Ivanov
>
> The method java.text.DecimalFormat("#######0.0000") throws MissingResourceException on Harmony and works fine on RI.
> ================== test.java ============================
> import java.net.*;
> import java.text.DecimalFormat;
> import java.io.IOException;
> public class test {
> public static void main(String[] args) {
> URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory() {
> public URLStreamHandler createURLStreamHandler(String protocol) {
> return new MyURLStreamHandler();
> }
> });
> System.out.println("res = " + new DecimalFormat("#######0.0000"));
> }
> }
> class MyURLConnection extends URLConnection {
> public MyURLConnection(URL u) {
> super(u);
> }
> public void connect() {
> }
> }
> class MyURLStreamHandler extends URLStreamHandler {
> protected MyURLStreamHandler() {
> super();
> }
> protected URLConnection openConnection(URL u) throws IOException {
> return new MyURLConnection(u);
> }
> protected void parseURL(URL u, String spec, int start, int limit) {
> super.parseURL(u, spec, start, limit);
> }
> protected void setURL(URL u, String protocol, String host, int port, String file, String ref) {
> super.setURL(u, protocol, host, port, file, ref);
> }
> protected void setURL(URL u, String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref) {
> super.setURL(u, protocol, host, port, authority, userInfo, path, query, ref);
> }
> }
> =====================================================
> Output:
> C:\tmp\tmp17>C:\jrockit-jdk1.5.0-windows-ia32\bin\java.exe -cp . -showversion test
> java version "1.5.0"
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
> BEA WebLogic JRockit(R) (build dra-38972-20041208-2001-win-ia32, R25.0.0-75, GC: System optimized over throughput (initial strategy singleparpar))
> res = java.text.DecimalFormat@674dc
> C:\tmp\tmp17>C:\harmony\classlib1.5\deploy\jdk\jre\bin\java.exe -cp . -showversion test
> java version 1.5 (subset)
> (c) Copyright 1991, 2006 The Apache Software Foundation or its licensors, as applicable.
> Exception in thread "main" java.util.MissingResourceException: Could not find the bundle com/ibm/icu/impl/data/icudt34b/en_US
> at com.ibm.icu.impl.ResourceBundleWrapper.getBundleInstance(ResourceBundleWrapper.java:17)
> at com.ibm.icu.util.UResourceBundle.instantiateBundle(UResourceBundle.java:511)
> at com.ibm.icu.util.UResourceBundle.getBundleInstance(UResourceBundle.java:127)
> at com.ibm.icu.util.UResourceBundle.getBundleInstance(UResourceBundle.java:18)
> at com.ibm.icu.util.UResourceBundle.getBundleInstance(UResourceBundle.java:195)
> at com.ibm.icu.text.DecimalFormatSymbols.initialize(DecimalFormatSymbols.java:555)
> at com.ibm.icu.text.DecimalFormatSymbols.<init>(DecimalFormatSymbols.java:58)
> at java.text.DecimalFormat.<init>(DecimalFormat.java:88)
> at java.text.DecimalFormat.<init>(DecimalFormat.java:70)
> at test.main(test.java:12)
> C:\tmp\tmp17>C:\harmony\drlvm1.5\build\win_ia32_msvc_debug\deploy\jre\bin\java -Dvm.assert_dialog=false -cp . -showversion test
> java version "1.5.0"
> pre-alpha : not complete or compatible
> svn = r431487, (Aug 15 2006), Windows/ia32/msvc 1310, debug build
> http://incubator.apache.org/harmony
> java.lang.ClassCastException
> at java.net.URLClassLoader.findResourceImpl(URLClassLoader.java:708)
> at java.net.URLClassLoader$5.run(URLClassLoader.java:665)
> at java.net.URLClassLoader$5.run(URLClassLoader.java:664)
> at java.security.AccessController.doPrivilegedImpl()
> at java.security.AccessController.doPrivileged()
> at java.net.URLClassLoader.findResource(URLClassLoader.java:663)
> at java.lang.ClassLoader$BootstrapLoader.findResource()
> at java.lang.ClassLoader.getResource()
> at java.lang.ClassLoader.getResourceAsStream()
> at java.lang.ClassLoader.getSystemResourceAsStream()
> at java.util.ResourceBundle$1.run(ResourceBundle.java:277)
> at java.util.ResourceBundle$1.run(ResourceBundle.java:276)
> at java.security.AccessController.doPrivilegedImpl()
> at java.security.AccessController.doPrivileged()
> at java.util.ResourceBundle.handleGetBundle(ResourceBundle.java:275)
> at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:158)
> at java.util.ResourceBundle.getBundle(ResourceBundle.java:100)
> at java.util.Locale$3.run(Locale.java:732)
> at java.util.Locale$3.run(Locale.java:731)
> at java.security.AccessController.doPrivilegedImpl()
> at java.security.AccessController.doPrivileged()
> at java.util.Locale.getBundle(Locale.java:730)
> at java.util.Currency.getInstance(Currency.java:95)
> at java.text.DecimalFormatSymbols.<init>(DecimalFormatSymbols.java:72)
> at java.text.DecimalFormatSymbols.<init>(DecimalFormatSymbols.java:55)
> at java.text.DecimalFormat.<init>(DecimalFormat.java:70)
> at test.main(test.java:12)
> C:\tmp\tmp17>C:\harmony\drlvm1.5\build\win_ia32_msvc_release\deploy\jre\bin\java -Dvm.assert_dialog=false -cp . -showversion test
> java version "1.5.0"
> pre-alpha : not complete or compatible
> svn = r431487, (Aug 15 2006), Windows/ia32/msvc 1310, release build
> http://incubator.apache.org/harmony
> java.lang.ClassCastException
> at java.net.URLClassLoader.findResourceImpl(URLClassLoader.java:708)
> at java.net.URLClassLoader$5.run(URLClassLoader.java:665)
> at java.net.URLClassLoader$5.run(URLClassLoader.java:664)
> at java.security.AccessController.doPrivilegedImpl()
> at java.security.AccessController.doPrivileged()
> at java.net.URLClassLoader.findResource(URLClassLoader.java:663)
> at java.lang.ClassLoader$BootstrapLoader.findResource()
> at java.lang.ClassLoader.getResource()
> at java.lang.ClassLoader.getResourceAsStream()
> at java.lang.ClassLoader.getSystemResourceAsStream()
> at java.util.ResourceBundle$1.run(ResourceBundle.java:277)
> at java.util.ResourceBundle$1.run(ResourceBundle.java:276)
> at java.security.AccessController.doPrivilegedImpl()
> at java.security.AccessController.doPrivileged()
> at java.util.ResourceBundle.handleGetBundle(ResourceBundle.java:275)
> at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:158)
> at java.util.ResourceBundle.getBundle(ResourceBundle.java:100)
> at java.util.Locale$3.run(Locale.java:732)
> at java.util.Locale$3.run(Locale.java:731)
> at java.security.AccessController.doPrivilegedImpl()
> at java.security.AccessController.doPrivileged()
> at java.util.Locale.getBundle(Locale.java:730)
> at java.util.Currency.getInstance(Currency.java:95)
> at java.text.DecimalFormatSymbols.<init>(DecimalFormatSymbols.java:72)
> at java.text.DecimalFormatSymbols.<init>(DecimalFormatSymbols.java:55)
> at java.text.DecimalFormat.<init>(DecimalFormat.java:70)
> at test.main(test.java:12)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.