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
# 1 楼答案
您将资源文件夹放在源文件夹中。这是坏习惯。将资源文件夹置于源文件夹之外
将资源文件夹添加到类路径。然后你可以用这句话:
别忘了在begin上添加
/
# 2 楼答案
必须在jar文件中提供文件的绝对路径(必须以
/
开头),例如:还可以尝试使用
getResourceAsStream()
:我在
getResource()
方面遇到过几次问题