-
Bug
-
Resolution: Fixed
-
P4
-
8, 11, 15, 17
-
b14
-
Not verified
ADDITIONAL SYSTEM INFORMATION :
Happens on all platforms.
A DESCRIPTION OF THE PROBLEM :
Please note that I've submitted a PR addressing this issue to OpenJDK at https://github.com/openjdk/jdk/pull/2662
java.net.URLClassLoader.getResource can throw an undocumented IllegalArgumentException.
According to the javadoc for the getResource and findResource methods, neither should be throwing IllegalArgumentException - they should return null if the resource can't be resolved.
Quoting https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/URLClassLoader.html#findResource(java.lang.String)
Returns:
a URL for the resource, or null if the resource could not be found, or if the loader is closed.
And quoting https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ClassLoader.html#getResource(java.lang.String)
Returns:
URL object for reading the resource; null if the resource could not be found, a URL could not be constructed to locate the resource, the resource is in a package that is not opened unconditionally, or access to the resource is denied by the security manager.
Neither mentions throwing IllegalArgumentException and both are clear that when URL can't be constructed, null should be returned.
Here's a stack trace:
java.lang.IllegalArgumentException: name
at java.base/jdk.internal.loader.URLClassPath$Loader.findResource(URLClassPath.java:600)
at java.base/jdk.internal.loader.URLClassPath.findResource(URLClassPath.java:291)
at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:655)
at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:653)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.net.URLClassLoader.findResource(URLClassLoader.java:652)
Looking at URLClassPath.findResource as seen at https://github.com/openjdk/jdk/blob/2b00367e1154feb2c05b84a11d62fb5750e46acf/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java#L603
URL findResource(final String name, boolean check) {
URL url;
try {
url = new URL(base, ParseUtil.encodePath(name, false));
} catch (MalformedURLException e) {
throw new IllegalArgumentException("name");
}
Instead of throwing IllegalArgumentException, that line should simply return null.
A similar issue exists at URLClassPath.getResource as seen at https://github.com/openjdk/jdk/blob/2b00367e1154feb2c05b84a11d62fb5750e46acf/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java#L639
URL findResource(final String name, boolean check) {
URL url;
try {
url = new URL(base, ParseUtil.encodePath(name, false));
} catch (MalformedURLException e) {
throw new IllegalArgumentException("name");
}
Instead of throwing IllegalArgumentException, that line should simply return null.
FREQUENCY : always
Happens on all platforms.
A DESCRIPTION OF THE PROBLEM :
Please note that I've submitted a PR addressing this issue to OpenJDK at https://github.com/openjdk/jdk/pull/2662
java.net.URLClassLoader.getResource can throw an undocumented IllegalArgumentException.
According to the javadoc for the getResource and findResource methods, neither should be throwing IllegalArgumentException - they should return null if the resource can't be resolved.
Quoting https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/URLClassLoader.html#findResource(java.lang.String)
Returns:
a URL for the resource, or null if the resource could not be found, or if the loader is closed.
And quoting https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ClassLoader.html#getResource(java.lang.String)
Returns:
URL object for reading the resource; null if the resource could not be found, a URL could not be constructed to locate the resource, the resource is in a package that is not opened unconditionally, or access to the resource is denied by the security manager.
Neither mentions throwing IllegalArgumentException and both are clear that when URL can't be constructed, null should be returned.
Here's a stack trace:
java.lang.IllegalArgumentException: name
at java.base/jdk.internal.loader.URLClassPath$Loader.findResource(URLClassPath.java:600)
at java.base/jdk.internal.loader.URLClassPath.findResource(URLClassPath.java:291)
at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:655)
at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:653)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.net.URLClassLoader.findResource(URLClassLoader.java:652)
Looking at URLClassPath.findResource as seen at https://github.com/openjdk/jdk/blob/2b00367e1154feb2c05b84a11d62fb5750e46acf/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java#L603
URL findResource(final String name, boolean check) {
URL url;
try {
url = new URL(base, ParseUtil.encodePath(name, false));
} catch (MalformedURLException e) {
throw new IllegalArgumentException("name");
}
Instead of throwing IllegalArgumentException, that line should simply return null.
A similar issue exists at URLClassPath.getResource as seen at https://github.com/openjdk/jdk/blob/2b00367e1154feb2c05b84a11d62fb5750e46acf/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java#L639
URL findResource(final String name, boolean check) {
URL url;
try {
url = new URL(base, ParseUtil.encodePath(name, false));
} catch (MalformedURLException e) {
throw new IllegalArgumentException("name");
}
Instead of throwing IllegalArgumentException, that line should simply return null.
FREQUENCY : always
- csr for
-
JDK-8263116 URLClassLoader.getResource throws undocumented IllegalArgumentException
-
- Closed
-
There are no Sub-Tasks for this issue.