Java 在命令提示符下运行时图像的NullPointerException

Java 在命令提示符下运行时图像的NullPointerException,java,swing,nullpointerexception,embedded-resource,imageicon,Java,Swing,Nullpointerexception,Embedded Resource,Imageicon,当我编译代码时,我有一个NullPointerException,但它在eclipse中运行良好 来自命令提示符的错误日志: java.lang.NullPointerException at sun.awt.image.URLImageSource.getConnection(Unknown Source) at sun.awt.image.URLImageSource.getDecoder(Unknown Source) at sun.awt.

当我编译代码时,我有一个
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相当陌生,所以如果有人能给我一些建议,那将是受欢迎的


编辑:好吧,我只是纠正了我自己不会发现的常见人为错误。谢谢。

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

要确保其工作正常,请执行以下操作:

  • 使用绝对路径(确认问题)
  • 运行程序时,请使用
    -cp
    ,并将必要的目录添加到
    类路径

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

    要确保其工作正常,请执行以下操作:

  • 使用绝对路径(确认问题)
  • 运行程序时,请使用
    -cp
    ,并将必要的目录添加到
    类路径

  • 此类没有编译失败(除了缺少的final
    }

    运行代码时出现问题。您可能遇到了与前面描述的问题相同的问题,它可能位于
    getClass().getResource(address2+name+“+type)


    从类路径读取资源是一件棘手的事情,因为当您找不到异常时,您不会得到异常,而是会得到
    null
    。此外,当从类路径读取时,如果在路径更改时使用类或类加载器,则必须小心。更多详细信息

    该类没有编译失败(除了缺少最终的
    }

    运行代码时出现问题。您可能遇到了与前面描述的问题相同的问题,它可能位于
    getClass().getResource(address2+name+“+type)

    从类路径读取资源是一件棘手的事情,因为当您找不到异常时,您不会得到异常,而是会得到
    null
    。此外,当从类路径读取时,如果在路径更改时使用类或类加载器,则必须小心。更多详细信息

    getClass()。getResource(路径)
    访问类路径中的资源“文件”(只读)。如果编译应用程序,则该文件驻留在jar中。使用7zip或WinZip,您可以查看jar内部并找到路径

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

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

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

    getClass()。getResource(path)
    访问类路径中的资源“文件”(只读)。如果编译应用程序,则该文件驻留在jar中。使用7zip或WinZip,您可以查看jar内部并找到路径

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

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


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

    看起来您的映像不在您认为的位置。@nachokk显然是运行时,它的NullPointerException@anshulkatta我知道,但标题的名称是编译时的:D,听起来像strange@nachokk哦,好的,我编辑过:我认为他的意思是当他从命令行运行而不是从IDE运行时。如果是这样的话,我怀疑问题在于系统属性“user.dir”在这两种情况下指向不同的位置。看起来你的图像并不是你想象的那样。@nachokk显然是运行时,它的NullPointerException@anshulkatta我知道,但标题的名称是编译时的:D,听起来像strange@nachokk哦,好的,我编辑过:我认为他的意思是当他从命令行运行而不是从IDE运行时。如果是这样的话,我怀疑问题在于系统属性“user.dir”在这两种情况下指向不同的位置。好吧,糟糕的是,事实证明它是区分大小写的,我在创建类后更改了文件名,但没有修复它,因为它在eclipse中仍然有效,所以我没有修复它。谢谢你的帮助。好吧,我的坏消息是,这是区分大小写的事情,自从创建类以来,我更改了文件的名称,但没有修复它,因为它在eclipse中仍然有效,所以我没有修复它。谢谢你的帮助。