有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java,在eclipse中访问资源文件夹中的图像

我有一个类,应该加载缓冲图像,但无论我在Eclipse中或在我的计算机上保存图像到哪里,我都无法访问它。这是课程

package com.m14x.game;

import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;

public class BufferedImageLoader {

    private BufferedImage image;

    public BufferedImage loadImage(String path) throws IOException{

        System.out.println(getClass());

        image = ImageIO.read(getClass().getResource(path));
        return image;``
    }
}

这是我的主要课程,在这里我得到了错误

package com.m14x.game;

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import com.m14x.game.BufferedImageLoader;
import com.m14x.game.SpriteSheet;

public class Game extends Canvas implements Runnable {

    private static final long serialVersionUID = 1L;
    public static final int WIDTH = 320;
    public static final int HEIGHT = WIDTH / 12 * 9;
    public static final int SCALE = 3;
    public static String TITLE = "2D Space Game";

    private boolean running = false;
    private Thread thread;

    private BufferedImage image = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
    private BufferedImage spriteSheet = null;

    // temp
    private BufferedImage player;

    public void init() {

        BufferedImageLoader loader = new BufferedImageLoader();
        try {

            spriteSheet = loader.loadImage("/sprite_sheet.png");

        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("7");
        SpriteSheet ss = new SpriteSheet(spriteSheet);
        player = ss.grabImage(1, 1, 32, 32);
    }

    public void run() {
        init();

        long lastTime = System.nanoTime();
        final double AMOUNT_OF_TICKS = 60.0;
        double ns = 1000000000 / AMOUNT_OF_TICKS;
        double delta = 0;
        int updates = 0;
        int frames = 0;
        long timer = System.currentTimeMillis();        
        while (running) {

            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;

            if (delta >= 1) {
                tick();
                updates++;
                delta -= 1;
            }
            render();
            frames++;

            if (System.currentTimeMillis() - timer > 1000) {
                timer += 1000;
                System.out.println("Frames: " + frames + ", Ticks: " + updates);
                updates = 0;
                frames = 0;
            }
        }
        stop();
    }

    private void tick() {
    }

    private void render() {

        BufferStrategy bs = this.getBufferStrategy();

        if (bs == null) {
            createBufferStrategy(3);
            return;
        }

        Graphics g = bs.getDrawGraphics();
        // //////// DRAW THINGS BELOW ///////////

        g.drawImage(image, 0, 0, getWidth(), getHeight(), this);

        g.drawImage(player, 100, 100, this);

        // //////// DRAW THINGS ABOVE ///////////
        g.dispose();
        bs.show();
    }

    private synchronized void start() {
        if (running) {
            System.out.println("Did not start, already running!");
            return;
        } else {
            System.out.println("Now running the thread!");
            running = true;
            thread = new Thread(this);
            thread.start();
        }
    }

    private synchronized void stop() {
        if (!running) {
            return;
        } else {
            running = false;
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.exit(1);
        }
    }

    public static void main(String[] args) {

        Game game = new Game();

        game.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        game.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        game.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));

        JFrame frame = new JFrame(Game.TITLE);
        frame.add(game);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        game.start();
    }
}

但当我尝试使用它时>spriteSheet = loader.loadImage("sprite_sheet.png");

我得到一个空指针异常。 我一直在寻找答案,但我发现没有一个有效

这就是我得到的确切错误

java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)
    at com.m14x.game.BufferedImageLoader.loadImage(BufferedImageLoader.java:19)
    at com.m14x.game.Game.init(Game.java:34)
    at com.m14x.game.Game.run(Game.java:46)
    at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-2" java.lang.NullPointerException
    at com.m14x.game.SpriteSheet.grabImage(SpriteSheet.java:15)
    at com.m14x.game.Game.init(Game.java:42)
    at com.m14x.game.Game.run(Game.java:46)
    at java.lang.Thread.run(Unknown Source)

这也是我的项目结构

-src
--com
---m14x
----game
-----BufferedImageLoader.java
-----Game.java
-----SpriteSheet.java
--res
---sprite_sheet.png

共 (2) 个答案

  1. # 1 楼答案

    您将资源文件夹放在源文件夹中。这是坏习惯。将资源文件夹置于源文件夹之外

    -src
     com
     -m14x
      game
      -BufferedImageLoader.java
      -Game.java
      -SpriteSheet.java
    -res
     -sprite_sheet.png
    

    将资源文件夹添加到类路径。然后你可以用这句话:

    spriteSheet = loader.loadImage("/sprite_sheet.png");
    

    别忘了在begin上添加/

  2. # 2 楼答案

    必须在jar文件中提供文件的绝对路径(必须以/开头),例如:

    /packageInsideResources/sprite_sheet.png

    还可以尝试使用getResourceAsStream()

    InputStream is = getClass.getResourceAsStream("/packageInsideResources/sprite_sheet.png");
    BufferedImage image = ImageIO.read(is);
    

    我在getResource()方面遇到过几次问题