On Sat, 20 Feb 2021 19:20:48 GMT, Craig Andrews <github.com+194713+candr...@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`. This pull request has now been integrated. Changeset: 0c718ab2 Author: Craig Andrews <candr...@integralblue.com> Committer: Brent Christian <bchri...@openjdk.org> URL: https://git.openjdk.java.net/jdk/commit/0c718ab2 Stats: 60 lines in 2 files changed: 57 ins; 0 del; 3 mod 8262277: URLClassLoader.getResource throws undocumented IllegalArgumentException Reviewed-by: alanb, bchristi, psadhukhan ------------- PR: https://git.openjdk.java.net/jdk/pull/2662