Jar Embedded Resources NullPointerException

时间:2012-12-10 06:54:41

标签: java netbeans project embedded-resource

我最初是从Chillax开始的,在遇到如此多的问题接近截止日期之后,我回到了IDE我更熟悉的IDE,NetBeans,并且我改变了我的方法来进行更基本的“小行星”式游戏:< / p>

在NetBeans中我得到:

Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(ImageIcon.java:205)
at gayme.Craft.<init>(Craft.java:27)
at gayme.Board.<init>(Board.java:54)
at gayme.Gayme.<init>(Gayme.java:9)
at gayme.Gayme.main(Gayme.java:19)
Java Result: 1
来源:(工艺26-34)

    public Craft() {
    ImageIcon ii = new ImageIcon(this.getClass().getResource("craft.png"));
    image = ii.getImage();
    width = image.getWidth(null);
    height = image.getHeight(null);
    missiles = new ArrayList();
    visible = true;
    x = 40;
    y = 60;}

(理事会54)

    craft = new Craft();

(Gayme 9)

    add(new Board());

(Gayme 19)

   new Gayme();

我有一些问题,我真的需要解决,而我的睡眠不足的大脑每个人都会失去一个。随意帮助您选择哪种游戏。 非常感谢你们!

1 个答案:

答案 0 :(得分:4)

有3种方法:

有关使用Jar文件和资源的一些事项要记住:

  • JVM区分大小写,因此文件和包名称区分大小写。即主类位于 mypackage 中,我们现在无法使用以下路径提取它: myPackAge

  • 任何时期'。'位于包名称内的应该用'/'

  • 替换
  • 如果名称以'/'('\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。执行类时,资源名称以 / 开头,资源位于不同的包中。

让我们使用我的首选getResource(..)方法将其添加到测试中,该方法将返回我们资源的网址:

我创建了一个包含2个包的项目: org.test my.resources

enter image description here

正如您所见,我的图片位于 my.resources ,而持有main(..)的Main类位于 org.test

Main.java:

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

public class Main {

    public static final String RES_PATH = "/my/resources";//as you can see we add / to the begining of the name and replace all periods with /
    public static final String FILENAME = "Test.jpg";//the case sensitive file name

    /*
     * This is our method which will use getResource to extarct a BufferedImage
     */
    public BufferedImage extractImageWithResource(String name) throws Exception {

        BufferedImage img = ImageIO.read(this.getClass().getResource(name));

        if (img == null) {
            throw new Exception("Input==null");
        } else {
            return img;
        }
    }

    public static void main(String[] args) {
        try {
            BufferedImage img = new Main().extractImageWithResource(RES_PATH + "/" + FILENAME);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}

如果您在不对实际文件进行适当更改的情况下使用RES_PATHFILENAME的名称,您将获得异常(只显示我们对路径的谨慎程度)

<强>更新

针对您的具体问题:

ImageIcon ii = new ImageIcon(this.getClass().getResource("craft.png"));

它应该是:

ImageIcon ii = new ImageIcon(this.getClass().getResource("/resources/craft.png"));

Alien和其他类也需要更改。