2014-02-15 68 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();