这是我的第一个问题,我希望它不会太糟糕。
我绝对是初学者,可能更低。事实上,我从教程中获取了大部分代码,希望我能尽快了解所有事情的作用。
无论如何,到目前为止,我的程序中有3个.java文件,它显示了所有3个中的异常,加上我从未做过的一个。
这是完整的错误:
Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(ImageIcon.java:205)
at Emilia.<init>(Emilia.java:17)
at Board.<init>(Board.java:26)
at TestGame.<init>(TestGame.java:7)
at TestGame.main(TestGame.java:18)
以下是所有code:
TestGame.java
import javax.swing.JFrame;
public class TestGame extends JFrame {
public TestGame() {
add(new Board());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
setTitle("Project Obcasus");
setResizable(false);
setVisible(true);
}
public static void main(String[] args) {
new TestGame();
}
}
Board.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Board extends JPanel implements ActionListener {
private Timer timer;
private Emilia emilia;
public Board() {
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
setDoubleBuffered(true);
emilia = new Emilia();
timer = new Timer(5, this);
timer.start();
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(emilia.getImage(), emilia.getX(), emilia.getY(), this);
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
public void actionPerformed(ActionEvent e) {
emilia.move();
repaint();
}
private class TAdapter extends KeyAdapter {
public void keyReleased(KeyEvent e) {
emilia.keyReleased(e);
}
public void keyPressed(KeyEvent e) {
emilia.keyPressed(e);
}
}
}
Emilia.java
import java.awt.Image;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
public class Emilia {
private String emilia = "emiliasprite.png";
private int dx;
private int dy;
private int x;
private int y;
private Image image;
public Emilia() {
ImageIcon ii = new ImageIcon(this.getClass().getResource(emilia));
image = ii.getImage();
x = 40;
y = 60;
}
public void move() {
x += dx;
y += dy;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public Image getImage() {
return image;
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_A) {
dx = -1;
}
if (key == KeyEvent.VK_D) {
dx = 1;
}
if (key == KeyEvent.VK_W) {
dy = -1;
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_A) {
dx = 0;
}
if (key == KeyEvent.VK_D) {
dx = 0;
}
if (key == KeyEvent.VK_W) {
dy = 0;
}
}
}
ImageIcon.java - 第205行
this(location, location.toExternalForm());
同样,我是初学者,所以如果你们可以解释它,就像你对java的新手(或任何编程语言)那样解释
感谢您的帮助。 - Niblexis
.png文件的路径:
C:\Users\Damon\workspace\TestGame\Resources\Sprites\Player
.png文件位于播放器文件夹中。我尝试通过Eclipse中的运行按钮运行程序。至少,我认为这是运行按钮,因为它首先显示了错误。
答案 0 :(得分:2)
看起来问题出在这一行:
ImageIcon ii = new ImageIcon(this.getClass().getResource(emilia));
这意味着您很可能没有将.png文件放在正确的位置以供Java查找。
你能在磁盘上发布.png文件的确切路径吗?
更具体地说:ImageIcon.java这一行中的空指针:
this(location, location.toExternalForm());
意味着网址location
为null
(在方法调用.toExternalForm()
中导致异常。如果您查看Class.getResource()
的文档,您会看到它说:
如果找不到具有此名称的资源,则返回
URL
个对象或null
这意味着Java无法找到有问题的资源。
为了帮助我们,您需要描述您的运行时环境(您是从.class文件运行程序还是在命令行或Eclipse / Netbeans中的调试器中运行.jar?)所以我们可以帮助您找出资源未找到的原因。
您在默认(root)程序包中使用Emilia.java有效地调用Emilia.class.getResource("emiliasprite.png")
,这意味着您需要告知IDE /构建过程将此文件复制到类路径的根目录中。 (在Emilia.class结束的同一目录中)否则,Java不知道在哪里找到它。
如果要将资源放在其他位置,则需要相应地更改路径,以及将资源从源目录复制到类路径上适当位置的机制。
请参阅此stackoverflow答案:Java in Eclipse: Where do I put files on the filesystem that I want to load using getResource? (e.g. images for an ImageIcon)