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

URLClassLoader.getResource throws undocumented IllegalArgumentException

    XMLWordPrintable

Details

    Description

      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


      Attachments

        Issue Links

          Activity

            People

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

              Dates

                Created:
                Updated:
                Resolved: