Why does the getResource() method return null in JDK 11?
I've tried your application with both openjdk 8 and 11 on MacOS and it does not work with both. I think you need to look at [1] and [2] in order to understand how getResourceAsStream
works.
TLDR:
If the path is absolute (i.e. starts with a slash -
/
), thenclass.getResourceAsStream()
searches in the provided pathIf the path is NOT absolute (i.e. does not start with a slash) , then
class.getResourceAsStream()
searches in a constructed path that corresponds to the package name, where the dots are replaced with slashes
So whether it works or not depends on 2 things:
- Is your path absolute or not ?
- Is the
file
located in the same package as the class or not ?
Basically in your exaple as is provided, it can never work if the path is not absolute, because Class.class.getResourceAsStream()
will always resolve the path to java/lang/<file>
, so your file must be in a system package. So instead you must use <MyClass>.class.getResourceAsStream()
or alternatively use an absolute path
[1] https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)
[2] https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResource%28java.lang.String%29
Update
Since Java SE 9, invoking getResourceXXX on a class in a named module will only locate the resource in that module, it will not search the class path as it did in previous release. So when you use Class.class.getResourceAsStream()
it will attempt to locate the resource in module containing java.lang.Class
, which is the java.base
module. Obviously your resource is not in that module, so it returns null.
You have to make java 9+ search for the file in your module, which most probably is an "unnamed module". You can do that by changing Class
to any class defined in your module in order to make java use the proper class loader.
getResourceAsStream returns null
Lifepaths.class.getClass().getResourceAsStream(...)
loads resources using system class loader, it obviously fails because it does not see your JARs
Lifepaths.class.getResourceAsStream(...)
loads resources using the same class loader that loaded Lifepaths class and it should have access to resources in your JARs
Java class.getResource() returns null
Files in the resources
folder will be packaged to the root of the .jar file, meaning that during development, the resources
folder itself is in the classpath, so you need this.getClass().getResource("/table.1gram")
, or without the /
since your class is in the unnamed package, aka also in the root of the .jar file.
Why does class.getResource() keep returning null although there is a resource at the specified path?
Short answer: Use "/img/smile.png"
.
What's actually happening is that any path starting with /
which is given to the Class.getResource method is always treated as being relative to each entry in the classpath.
As your screenshot shows, the res
directory is such a classpath entry. So the Class.getResource method treats the path you provide as relative to that entry. Meaning, relative to the res
directory.
So, the method combines your string argument with that directory, which results in res/res/img/smile.png
. Since no file (resource) exists at that location, it returns null.
Related Topics
How to Use Annotations to Define Different Types of Relationships in Hibernate 4 and Spring
Java Reverse an Int Value Without Using Array
Simpledateformat and Locale Based Format String
How to Make Httpurlconnection Use a Proxy
Border with Rounded Corners & Transparency
Build Eclipse Java Project from Command Line
Difference Between Java Hh:Mm and Hh:Mm on Simpledateformat
What Is the Best Approach for Using an Enum as a Singleton in Java
How to Use an Internet Time Server to Get the Time
Concurrentmodificationexception Despite Using Synchronized
Adding Elements to a Collection During Iteration
Where Is Java_Home on MACos Mojave (10.14) to Lion (10.7)
Call "Java -Jar Myfile.Jar" with Additional Classpath Option
Difference Between @Before, @Beforeclass, @Beforeeach and @Beforeall
Java Ee 6 @Javax.Annotation.Managedbean VS. @Javax.Inject.Named VS. @Javax.Faces.Managedbean
Redirect to an External Url from Controller Action in Spring MVC
Can't Read and Write a Tiff Image File Using Java Imageio Standard Library