使用BuffereImage加载精灵时出现JAVA错误

使用BuffereImage加载精灵时出现JAVA错误,java,image,graphics,Java,Image,Graphics,我在遵循一个教程,我遇到了这个错误,我似乎无法解决问题是什么。我所要做的就是加载一个精灵图像。代码如下: 以下是错误: 线程“thread-0”java.lang.NullPointerException中出现异常 位于com.mainpkg.game.Handler.gg(Handler.java:27) 位于com.mainpkg.game.game.render(game.java:107) 在com.mainpkg.game.game.run(game.java:83) 位于java.b

我在遵循一个教程,我遇到了这个错误,我似乎无法解决问题是什么。我所要做的就是加载一个精灵图像。代码如下:

以下是错误:

线程“thread-0”java.lang.NullPointerException中出现异常 位于com.mainpkg.game.Handler.gg(Handler.java:27) 位于com.mainpkg.game.game.render(game.java:107) 在com.mainpkg.game.game.run(game.java:83) 位于java.base/java.lang.Thread.run(Thread.java:844)

主要游戏类别:

public class Game extends Canvas implements Runnable {

public static final int WIDTH = 800, HEIGHT = WIDTH / 12 * 9;
private Thread thread;
private boolean running = false;
private Handler handler;
private BufferedImage grassTile;

public Game() {
    new Window(WIDTH, HEIGHT, "MOON EXPOLATION", this);
    handler = new Handler(getWidth(), getHeight());
    testImage = loadImage("Resources/GrassTile.png");
}

private BufferedImage loadImage(String path) {
    try {
        BufferedImage loadedImage = ImageIO.read(new FileInputStream(path));
        BufferedImage formattedImage = new BufferedImage(loadedImage.getWidth(), loadedImage.getHeight(),
                BufferedImage.TYPE_INT_RGB);
        formattedImage.getGraphics().drawImage(loadedImage, 0, 0, null);
        return formattedImage;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

public synchronized void start() {
    thread = new Thread(this);
    thread.start();
    running = true;
}

public synchronized void stop() {
    try {
        thread.join();
        running = false;
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void run() {

    int FRAMES = 0;
    int TICKS = 0;
    long lastTime = System.nanoTime();
    double unprocessed = 0;
    double nsPerSecs = 1000000000 / 60.0;
    long Timer = System.currentTimeMillis();
    while (running) {
        long now = System.nanoTime();
        unprocessed += (now - lastTime) / nsPerSecs;
        lastTime = now;

        if (unprocessed >= 1) {
            TICKS++;
            ticks();
            unprocessed -= 1;
        }
        try {
            Thread.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        FRAMES++;
        render();

        if (System.currentTimeMillis() - Timer > 1000) {
            System.out.println("Ticks: " + TICKS + " FPS: " + FRAMES);
            TICKS = 0;
            FRAMES = 0;
            Timer += 1000;
        }
    }
    stop();
}

private void ticks() {

}

void render() {
    BufferStrategy bs = this.getBufferStrategy();
    if (bs == null) {
        super.paint(getGraphics());
        this.createBufferStrategy(3);
        return;
    }
    Graphics g = bs.getDrawGraphics();
    handler.renderImage(testImage, 0, 0);
    handler.render(g);
    // g.setColor(Color.BLACK);
    // g.fillRect(0,0,WIDTH,HEIGHT);

    g.dispose();
    bs.show();
}

public static void main(String[] args) {
    new Game();
}
处理程序类:

public class Handler {

private BufferedImage view;
private int pixels[];

public Handler(int width, int height) {
    view = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    pixels = ((DataBufferInt) view.getRaster().getDataBuffer()).getData();
}

public void render(Graphics g) {
    g.drawImage(view, 0, 0, view.getWidth(), view.getHeight(), null);
}

public void renderImage(BufferedImage image, int xPosition,int yPosition) {
    int[] imagepixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

    for(int y = 0; y < image.getHeight(); y++) {
        for(int x = 0; x < image.getWidth(); x++) {
            pixels[(x + xPosition) + (y + yPosition ) * view.getWidth()] =  imagepixels[x +  y * image.getWidth()];
        }
    }
}
公共类处理程序{
私有缓冲区图像视图;
私有整数像素[];
公共处理程序(整数宽度、整数高度){
视图=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
像素=((DataBufferInt)view.getRaster().getDataBuffer()).getData();
}
公共空间渲染(图形g){
g、 drawImage(视图,0,0,view.getWidth(),view.getHeight(),null);
}
公共空白渲染(BuffereImage图像、int xPosition、int yPosition){
int[]imagepixels=((DataBufferInt)image.getRaster().getDataBuffer()).getData();
对于(int y=0;y
问题在于:

BufferedImage loadedImage = ImageIO.read(Game.class.getResource(path));
getResource(path)返回null,这导致异常

尝试将图像路径更改为“Assets/GrassTile.png”

一个提示:


你应该避免使用绝对路径来定位你的资源。这是一个非常糟糕的主意,因为如果你更改项目的位置,它将停止工作,请尝试使用相对路径。

嘿,谢谢你的回复,我已经尝试了你建议的方法,但不幸的是没有成功,我仍然收到一个错误。是相同的错误吗?如果是这样的话在这种情况下,我确信这是导致异常的路径。我将精灵移动到项目的主文件中,并使用这个buffereImage LoadeImage=ImageIO.read(getClass().getResource(“GrassTile.png”);