RFR: 8262277: java.net.URLClassLoader.getResource throws undocumented IllegalArgumentException

Brent Christian bchristi at openjdk.java.net
Wed Mar 3 18:13:41 UTC 2021


On Wed, 3 Mar 2021 14:28:00 GMT, Alan Bateman <alanb at openjdk.org> wrote:

>> _NOTE_: I've reported this issue at https://bugreport.java.com/ (internal review ID : 9069151)
>> 
>> `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 the javadoc for [`URLClassLoader.html#findResource`](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 the javadoc for [`ClassLoader.html#getResource`](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`](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`](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`.
>
> This seems to be a long standing bug, maybe goes all the way back to JDK 1.2. Are you planning to add a regression test?

Hi, Craig
The commented-out lines should be removed from the change.

As Alan said, a regression test will be needed.  At minimum, it should test a method that returns a URL, as well as a method that returns an Enumeration<URL> (which can also lead to an IAE, as I noted in the bug report).

Also, though the compatibility risk is low, it would be good to include a CSR for this change to long-standing behavior.

-------------

PR: https://git.openjdk.java.net/jdk/pull/2662


More information about the core-libs-dev mailing list