Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8262277

URLClassLoader.getResource throws undocumented IllegalArgumentException

XMLWordPrintable

      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


        There are no Sub-Tasks for this issue.

            bchristi Brent Christian
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: