getClass()。getResource()返回null

时间:2018-03-27 01:59:30

标签: java resources

所以,我试图为可能最终成为游戏的东西开发一个原型,并且在尝试将它们作为资源访问时我无法获取图像,禁止它有效。

这是代码:

public class Main {
    static boolean finished = false;
    static ArrayList<Entity> entities = new ArrayList<>();

    JFrame frame = new JFrame("Battle System Prototype #1");
    frame.setVisible(true);
    frame.setSize(800, 600);
    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    frame.addWindowListener(new java.awt.event.WindowAdapter() {
        @Override
        public void windowClosing(java.awt.event.WindowEvent windowEvent) {
            if (JOptionPane.showConfirmDialog(frame, "Are you sure to close this window?", "Really Closing?",
                    JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
                System.exit(0);
            }
        }
    });

    frame.addMouseListener(gml);

    Graphic g = new Graphic();
    frame.add(g);

    BufferedImage playerDefault = null;
    BufferedImage monsterDefault = null;
    try {
        playerDefault = ImageIO.read(getClass().getResource("/res/playerdef.png"));
        monsterDefault = ImageIO.read(getClass().getResource("/res/monsterdef.png"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    entities.add(new Player(20, 325, 400, "Player 1", playerDefault, null, null, null, null));
    entities.add(new Player(20, 325, 330, "Enemy", monsterDefault, null, null, null, null));

    while (!finished) {
        g.repaint();
    }
}

public static void main(String[] args) {
    Main main = new Main();
    main.run();
}

}

这是堆栈跟踪:

Exception in thread "main" java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)
    at battleSystemPrototype1.Main.run(Main.java:113)
    at battleSystemPrototype1.Main.main(Main.java:133)

/ images文件夹位于包装下,所以我不认为这是问题所在。我怀疑我在语法上遗漏了一些东西,但我不知道是什么。我做错了什么?

编辑:它是/ res文件夹,而不是/ images,以防万一。

1 个答案:

答案 0 :(得分:-1)

如果您的代码在

/some/path/src/packageName/Main.java

您的图片位于包目录下方的“res”目录中......

/some/path/src/packageName/res/playerdef.png
/some/path/src/packageName/res/monsterdef.png

然后是代码:

getClass().getResource("/res/playerdef.png")

将在此处查找资源:

[build-destination]/res/playerdef.png

相反,你想要:

getClass().getResource("res/playerdef.png")

这将在此处搜索资源:

[build-destination]/packageName/res/playerdef.png

注意缺少前导/,它指示类加载器开始查看类路径的根目录,而不是从当前包开始。

注意:

以上假设您的特定构建环境会将src目录树中找到的任何资源类型文件(例如.png)复制到目标构建目录结构中的相应位置(实际目录或jar文件)。具体细节取决于您的构建工具或IDE。