【问题标题】:java.lang.NullPointerException Issue When Attempting to Run Program [duplicate]尝试运行程序时出现java.lang.NullPointerException问题[重复]
【发布时间】:2014-10-22 23:53:34
【问题描述】:

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

我绝对是java的初学者,可能更低。事实上,我的大部分代码都来自教程,希望我能尽快了解所有内容。

无论如何,到目前为止,我的程序中有 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(或任何编程语言的新手)一样解释它

感谢您的帮助。 - 尼克西斯


.png 文件的路径:

C:\Users\Damon\workspace\TestGame\Resources\Sprites\Player 

.png 文件位于播放器文件夹中。我试图通过 Eclipse 中的运行按钮运行程序。至少,我认为它是运行按钮,因为它首先向我显示了错误。

【问题讨论】:

  • 使用 github gist 共享多个文件。以这种方式通过 pastebin 将文件组合成一个文件是一个绊脚石,因为我们无法轻松匹配行号。
  • 因为分数低的用户在 SO 上能做的事情是有限的。无论如何,SO也不显示行号。
  • ...除非责任归咎于此,否则发布内置类的内部内容并没有多大意义。

标签: java nullpointerexception


【解决方案1】:

看起来问题出在这一行:

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

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

您能否发布 .png 文件在磁​​盘上的确切路径?


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

this(location, location.toExternalForm());

暗示 URL location 是 null(导致方法调用 .toExternalForm() 出现异常。如果您查看 Class.getResource() 的文档,您会看到它说:

返回:URL 对象或null,如果没有找到同名的资源

这意味着 Java 找不到相关资源。

为了我们的帮助,您需要描述您的运行时环境(您是从 .class 文件还是在 .jar 中运行程序?在命令行还是在 Eclipse / Netbeans 的调试器中?),以便我们可以帮助您找出找不到资源的原因。


您实际上是在默认(根)包中使用 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)

【讨论】:

  • 您应该提到所有资产 (images, configurations, ...) 应该在源目录下的 ./resources/ 文件夹中,并且该文件夹应该导出到类路径。
  • NPE 通常是由对 NULL 对象的引用引起的。 (好吧,总是很好)它不是由不存在的文件引起的,因为这会导致 FileNotFoundException。 (异常的子类)
  • 嗯,这很奇怪....
  • 如果我错了,请纠正我:)
  • JClassic:你的解释听起来很合理,但你错了; Class.getResource() 如果找不到资源,则返回 null。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 2017-09-28
相关资源
最近更新 更多