RFR: JDK-8262277: java.net.URLClassLoader.getResource throws undocumented IllegalArgumentException [v5]

Alan Bateman alanb at openjdk.java.net
Sat Mar 6 07:36:06 UTC 2021


On Sat, 6 Mar 2021 01:35:28 GMT, Craig Andrews <github.com+194713+candrews at openjdk.org> wrote:

>> `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`.
>
> Craig Andrews has refreshed the contents of this pull request, and previous commits have been removed. The incremental views will show differences compared to the previous content of the PR.

The fix looks good. Brent has created a CSR. It seems unlikely that anyone is depending the long standing/broken behavior but it seems release note worthy.

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

Marked as reviewed by alanb (Reviewer).

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


More information about the core-libs-dev mailing list