【问题标题】:NullPointerException for images when running in command prompt [closed]在命令提示符下运行时图像出现 NullPointerException [关闭]
【发布时间】:2013-06-04 20:08:20
【问题描述】:

当我编译我的代码时,我有一个NullPointerException,但它在 eclipse 中运行良好。

来自命令提示符的错误日志:

java.lang.NullPointerException
        at sun.awt.image.URLImageSource.getConnection(Unknown Source)
        at sun.awt.image.URLImageSource.getDecoder(Unknown Source)
        at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
        at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
        at sun.awt.image.ImageFetcher.run(Unknown Source)

获取图片的类是:

package tileGame;

import java.awt.Toolkit;
import javax.swing.ImageIcon;


public class Image {


public String address1;
public String address2;
public String name;
public String type;

public java.awt.Image image;

public Image(String name){
    address1 = System.getProperty("user.dir");
    address2 = "/Resources/Images/";
    type = "png";
    this.name = name;
}
public Image(String name, String type){
    address1 = System.getProperty("user.dir");
    address2 = "/src/Resources/Images/";
    this.type = type;
    this.name = name;
}
public Image(String name, String type, String address){
    address1 = System.getProperty("user.dir");
    this.address2 = address;
    this.type = type;
    this.name = name;
}
public void loadImage(){
    //image = new ImageIcon(address1 + address2 + name + "." + type).getImage();
    image = new ImageIcon(Toolkit.getDefaultToolkit().getImage(getClass().getResource(address2 + name + "." + type))).getImage();
    System.out.println("Image Loaded '" + name + "' at '" + address2 + name + "." + type + "'");
}

}

这可能有一个很好的理由,因为我对 Java 还很陌生,所以如果有人能给我一些指示,那将是受欢迎的。

编辑:好的,我修复了我自己不会发现的常见人为错误。谢谢。

【问题讨论】:

  • 看起来你的图片不是你想象的那样。
  • @nachokk 显然是运行时,它的 NullPointerException
  • @anshulkatta 我知道,但是标题的名称是编译时的名称:D,听起来很奇怪
  • @nachokk 哦,好吧,我已经编辑了:P
  • 我认为他的意思是当他从命令行运行而不是他的 IDE 时。如果是这样,我怀疑问题是系统属性“user.dir”在这两种情况下指向不同的位置。

标签: java swing nullpointerexception embedded-resource imageicon


【解决方案1】:

getClass().getResource(path) 访问类路径中的资源“文件”(只读)。如果应用程序已编译,则此文件位于 jar 中。使用 7zip 或 WinZip,您可能会查看 jar 内部并找到路径。

路径使用任何 URL / 作为路径分隔符。 路径可以相对于类(记住getClass()),即包路径。 该路径也可以是 jar 根目录的绝对路径:“/...”。

此外,路径必须区分大小写,而不是 Windows 文件路径。

在您的情况下,不需要任何系统属性来获取文件系统路径。

【讨论】:

  • 好吧,我的错,事实证明这是区分大小写的事情,自创建类以来我已经更改了文件的名称,并且没有修复它,因为它仍然在 eclipse 中工作,所以我没有修复它。感谢您的帮助。
【解决方案2】:

这个类没有编译失败(除了缺少最后的}

您在运行代码时遇到了问题。您可能遇到了与here 描述的相同问题,它可能在getClass().getResource(address2 + name + "." + type) 中。

从类路径中读取资源很棘手,因为当你找不到它们时你不会得到异常,而是得到null。此外,在从类路径读取时,如果您使用类或类加载器作为路径更改,则必须小心。更多详情here

【讨论】:

    【解决方案3】:

    这是因为相对路径问题。 java.exe 是从 eclipse 和命令提示符中的不同目录开始的。

    为了确保它有效:

    1. 使用绝对路径(确认问题)
    2. 运行程序时使用-cp 并将必要的目录添加到classpath

    【讨论】:

      猜你喜欢
      • 2019-11-13
      • 2016-04-05
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 2020-12-16
      • 2023-03-25
      相关资源
      最近更新 更多