2014-02-15 47 views
0

我在Linux上创建了一个项目,该项目使用各种资源(.png和.xml),当我在Linux上运行代码时已成功加载,但一旦导出该项目到Windows它会引发空指针异常,当我尝试做同样的事情。Eclipse - 从Linux导入Windows的项目不加载资源

导出/导入是通过存档文件机制完成的,我也尝试手动导入源文件,创建文件夹并将资源文件导入它们。文件夹结构看起来完好无损,资源文件夹在两个平台上都被标记为源文件夹。

而不是硬编码文件分隔符我已经使用了依赖于系统的文件分隔符,所以应该没有问题。

Misc。信息:Linux Mint的32位/ Windows 7的64位,日食带的WindowBuilder,爪哇1.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())); 
     } 
    } 

堆栈跟踪:

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) 
+0

究竟你的gameImages目录在哪里? –

+0

@JunedAhsan它位于“资源”文件夹内。一切都是通过Eclipse添加的,而不是直接通过文件系统。 – Venom

回答

3

.getResource() won't accept a backslash as a separator

你需要改变:

File.separator + "gameImages" 

到:

"/gameImages" 

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

附录:由于您使用Java 1.7,因此请使用新的Files API。

+0

就是这样,谢谢。不会丢弃文件,但如果它没有损坏,请不要修复它! ;) – Venom

+0

但是'File' API被破坏了(当FileNotFoundException时,实际上问题在于你无法访问该文件?)。相信我,使用'文件'。 – fge

+0

它适用于您所建议的解决方案,而且这不是一个“严肃”的项目。无论如何,我感谢你的建议。 – Venom

1

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