简体   繁体   中英

Java game won't read image file

For some reason, my program can't find an image. I've tried absolutely everything and made sure the file path is exact. It worked fine in my previous game but now it just won't find the image at all.

Entity class

package Entities;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Entity
{
    public double x, y, width, height, dx, dy;

    public BufferedImage image;

    public Entity(String s)
    {
        try
        {       //error occurs here
            image = ImageIO.read(getClass().getResourceAsStream(s)); 
        } 
        catch (IOException e)
        {
            e.printStackTrace();
        }

        width = image.getWidth();
        height = image.getHeight();
    }

    public void update()
    {
        x += dx;
        y += dy;
    }

    public void draw(Graphics2D g)
    {
        g.drawImage(image, (int)x, (int)y, null);
    }
}

GamePanel class

package Main;

//import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

import Entities.Entity;

@SuppressWarnings("serial")
public class GamePanel extends JPanel implements Runnable, KeyListener
{
    public static final int WIDTH = 320;
    public static final int HEIGHT = 240;
    public static final int SCALE = 2;

    //game thread
    private Thread thread;
    private boolean running;
    private int fps = 60;
    private long targetTime = 1000/fps;

    //image
    private BufferedImage image;
    private Graphics2D g;

    //test
    public Entity e;

    public GamePanel()
    {
        super();
        setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        setFocusable(true);
        requestFocus();
    }

    public void addNotify()
    {
        super.addNotify();
        if(thread == null)
        {
            thread = new Thread(this);
            addKeyListener(this);
            thread.start();
        }
    }

    public void init()
    {
        image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        g = (Graphics2D) image.getGraphics();
        running = true;

        e = new Entity("Resources/Test/test.png");
    }

    @Override
    public void keyPressed(KeyEvent key) 
    {
        //p1.keyPressed(key.getKeyCode());
    }

    @Override
    public void keyReleased(KeyEvent key) 
    {
        //p1.keyReleased(key.getKeyCode());
    }

    @Override
    public void keyTyped(KeyEvent arg0) 
    {

    }

    @Override
    public void run() 
    {
        init();

        long start;
        long elapsed;
        long wait;

        //game loop
        while(running)
        {
            start = System.nanoTime();

            update();
            draw();
            drawToScreen();

            elapsed = System.nanoTime() - start;

            wait = targetTime - elapsed/1000000;

            if(wait < 0)
            {
                wait = 5;
            }

            try
            {
                Thread.sleep(wait);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }

    }

    private void drawToScreen() 
    {
        Graphics g2 = getGraphics();
        g2.drawImage(image, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
        g2.dispose();

    }

    private void draw() 
    {
        //e.draw(g);
    }

    private void update() 
    {

    }
}

This is the error

Exception in thread "Thread-2" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)
at Entities.Entity.<init>(Entity.java:19)
at Main.GamePanel.init(GamePanel.java:67)
at Main.GamePanel.run(GamePanel.java:93)
at java.lang.Thread.run(Unknown Source)

A path Resources/Test/test.png suggest a relative path from the location of the class reference used to try and load it.

Since you are using your Entity class to try and load the image, and Entity resides in the Entities package, this will generate an absolute path (from the context of the class path) of /Entities/Resources/Test/test.png , which is obviously incorrect.

Try using /Resources/Test/test.png instead (assuming the Resources resides at the top of the path tree, for example...

+ Resources
  + Test
    - test.png
+ Entities
  - Entity
+ Main
  - GamePanel 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM