Java Eclipse-从Linux导入到Windows的项目未加载资源

Java Eclipse-从Linux导入到Windows的项目未加载资源,java,eclipse,resources,project,Java,Eclipse,Resources,Project,我在Linux上创建了一个项目,该项目使用了各种资源(.png和.xml),当我在Linux上运行代码时,这些资源会成功加载,但一旦我将项目导出到Windows,当我尝试执行相同操作时,它会抛出空指针异常 导出/导入是通过归档文件机制完成的,我还尝试手动导入源文件、创建文件夹并将资源文件导入其中。文件夹结构看起来完好无损,资源文件夹在两个平台上都按原样标记为源文件夹 我使用了与系统相关的文件分隔符,而不是硬编码文件分隔符,因此这方面应该没有问题 杂项。信息:LinuxMint32位/Window

我在Linux上创建了一个项目,该项目使用了各种资源(.png和.xml),当我在Linux上运行代码时,这些资源会成功加载,但一旦我将项目导出到Windows,当我尝试执行相同操作时,它会抛出空指针异常

导出/导入是通过归档文件机制完成的,我还尝试手动导入源文件、创建文件夹并将资源文件导入其中。文件夹结构看起来完好无损,资源文件夹在两个平台上都按原样标记为源文件夹

我使用了与系统相关的文件分隔符,而不是硬编码文件分隔符,因此这方面应该没有问题

杂项。信息:LinuxMint32位/Windows764位,带WindowBuilder的Eclipse,Java1.7(在两种平台上)

资源加载的一个示例:

public static void loadGameImages(TreeMap<String, ImageIcon> imageMap)
    {
        String dir_path = GameMechanics.class.getResource(
                File.separator + "gameImages").toString(); // this is where the whole thing breaks
        URI uri = null;
        try
        {
            uri = new URI(dir_path);
        }
        catch (Exception ex)
        {
            raiseError(ex);
        }

        File dir = new File(uri.getPath());
        File[] images = null;
        if (dir.isDirectory())
            images = dir.listFiles();
        for (File f : images)
        {
            if (f.isFile())
                imageMap.put(f.getName(), new ImageIcon(f.getPath()));
        }
    }
publicstaticvoidloadgameimages(TreeMap-imageMap)
{
String dir_path=GameMechanics.class.getResource(
File.separator+“gameImages”).toString();//这就是整个过程的转折点
URI=null;
尝试
{
uri=新uri(目录路径);
}
捕获(例外情况除外)
{
raiseError(ex);
}
File dir=新文件(uri.getPath());
文件[]图像=null;
if(dir.isDirectory())
images=dir.listFiles();
用于(文件f:图像)
{
if(f.isFile())
put(f.getName(),newImageIcon(f.getPath());
}
}
堆栈跟踪:

java.lang.NullPointerException
    at hangman.GameMechanics.loadGameImages(GameMechanics.java:98)
    at hangman.MainWindow.<init>(MainWindow.java:90)
    at hangman.MainWindow$1.run(MainWindow.java:65)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
java.lang.NullPointerException
在hangman.GameMechanics.loadGameImages(GameMechanics.java:98)
在hangman.MainWindow。(MainWindow.java:90)
在hangman.mainfown$1.run(mainfown.java:65)
在java.awt.event.InvocationEvent.dispatch(未知源)处
位于java.awt.EventQueue.dispatchEventImpl(未知源)
位于java.awt.EventQueue.access$200(未知源)
在java.awt.EventQueue$3.run处(未知源)
在java.awt.EventQueue$3.run处(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)
位于java.awt.EventQueue.dispatchEvent(未知源)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(未知源)
位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源)
位于java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.run(未知源)

您需要更改:

File.separator + "gameImages"
致:

更一般地说,URI中的路径分隔符(URL是URI的子集)是
/
,从不
\

附录:由于您使用Java 1.7,请删除
文件
,使用新的
文件
API。

您需要更改:

File.separator + "gameImages"
致:

更一般地说,URI中的路径分隔符(URL是URI的子集)是
/
,从不
\


附录:由于您使用Java 1.7,删除
文件
,使用新的
文件
API。

在Java中处理文件的库,您可以安全地在所有平台上使用。所以您可以这样调用它
GameMechanics.class.getResource(“/gameImages”).toString()

在处理文件的Java库中,您可以在所有平台上安全地使用/。所以您可以这样调用它
GameMechanics.class.getResource(“/gameImages”).toString()

您的gameImages目录具体在哪里?@JunedAhsan它在“资源”文件夹中。所有内容都是通过Eclipse添加的,而不是直接通过文件系统添加的。您的gameImages目录具体在哪里?@JunedAhsan它位于“resources”文件夹中。所有内容都是通过Eclipse添加的,而不是直接通过文件系统添加的。但不会丢弃文件-如果文件没有损坏,就不要修复它!;)但是
文件
API已损坏(当问题实际上是您无法访问该文件时,
FileNotFoundException
如何处理?)。相信我,使用
文件
。它与您建议的解决方案配合得很好,而且,这不是一个“严肃”的项目。不管怎样,我很感激你的建议。就这样,谢谢你。但不会丢弃文件-如果文件没有损坏,就不要修复它!;)但是
文件
API已损坏(当问题实际上是您无法访问该文件时,
FileNotFoundException
如何处理?)。相信我,使用
文件
。它与您建议的解决方案配合得很好,而且,这不是一个“严肃”的项目。无论如何,我感谢你的建议。