java.lang.NullPointerException尝试运行程序时的问题

时间:2014-08-29 01:18:43

标签: java nullpointerexception

这是我的第一个问题,我希望它不会太糟糕。

我绝对是初学者,可能更低。事实上,我从教程中获取了大部分代码,希望我能尽快了解所有事情的作用。

无论如何,到目前为止,我的程序中有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中的运行按钮运行程序。至少,我认为这是运行按钮,因为它首先显示了错误。

1 个答案:

答案 0 :(得分:2)

看起来问题出在这一行:

ImageIcon ii = new ImageIcon(this.getClass().getResource(emilia));

这意味着您很可能没有将.png文件放在正确的位置以供Java查找。

你能在磁盘上发布.png文件的确切路径吗?


更具体地说:ImageIcon.java这一行中的空指针:

this(location, location.toExternalForm());

意味着网址locationnull(在方法调用.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)