getClassLoader().getResource() returns null

后端 未结 4 741
天命终不由人
天命终不由人 2020-11-28 13:08

I have this test app:

import java.applet.*;
import java.awt.*;
import java.net.URL;
public class Test extends Applet
{

    public void init()
    {
                 


        
相关标签:
4条回答
  • 2020-11-28 13:15
    • When you use .getClass().getResource(fileName) it considers the location of the fileName is the same location of the of the calling class.
    • When you use .getClass().getClassLoader().getResource(fileName) it considers the location of the fileName is the root - in other words bin folder

    It hits NullPointerException if the file is actually not exist there.

    Source:

    package Sound;
    public class ResourceTest {
        public static void main(String[] args) {
            String fileName = "Kalimba.mp3";
            System.out.println(fileName);
            System.out.println(new ResourceTest().getClass().getResource(fileName));
            System.out.println(new ResourceTest().getClass().getClassLoader().getResource(fileName));
    

    Output:

    Kalimba.mp3
    file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Sound/Kalimba.mp3
    file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Kalimba.mp3
        }
    }
    
    0 讨论(0)
  • 2020-11-28 13:17

    This works for me:

    URL viaClass=Test.class.getResource("assets/test.html");

    which assets in the same folder with Test.class output file (after a miserable checking and debugging)

    0 讨论(0)
  • 2020-11-28 13:23

    I would do it this way:

    final InputStream stream;
    
    stream = Test.class.getResourceAsStream("assets/pacman.png");
    System.out.println("Stream = " + stream);
    

    "/assets/pacman.png" is an absolute location whle "assets/pacman.png" is a relative location.

    0 讨论(0)
  • 2020-11-28 13:35

    You don't need the slash at the start when getting a resource from a ClassLoader, because there's no idea of a "relative" part to start with. You only need it when you're getting a resource from a Class where relative paths go from the class's package level.

    In addition, you don't want Test.class.getClass() as that gets the class of Test.class, which will be Class<Class>.

    In other words, try either of these lines:

    URL viaClass=Test.class.getResource("/assets/pacman.png");
    URL viaLoader=Test.class.getClassLoader().getResource("assets/pacman.png");
    
    0 讨论(0)
提交回复
热议问题