2013-09-27 57 views
1

我正在使用JavaFX並嘗試將CS​​S文件加載到我的場景中。從類路徑之外的目錄加載資源時的NPE

scene.getStyleSheets().add(Main.class.getResource("res/application.css").toExternalForm(); 

拋出一個NPE。我想這是因爲CSS文件不在類路徑中,但我不知道如何以這種方式加載它。我不想將css文件包含在我的軟件包目錄(com.somecompany.package)中,我更願意將它包含在一個單獨的目錄中,該目錄可以自行部署(因此用戶可以根據需要進行修改)。

如何從類路徑外部加載一個css文件(或資源)?

我的堆棧跟蹤:

java.lang.NullPointerException 
     at com.somecompany.someapp.Main.start(Main.java:30) 
     at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319) 
     at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:206) 
     at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173) 
     at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
     at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29) 
     at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73) 
    at java.lang.Thread.run(Unknown Source) 
+0

如果無法找到該文件,那麼它應該拋出FileNotFoundException ...你能粘貼NPE的堆棧跟蹤嗎? –

+0

@GV'Class#getResource()如果找不到資源,則返回null。 –

+0

添加了堆棧跟蹤。 Main.class的第30行是上面的行。 @SotiriosDelimanolis是對的,這是一個n,因爲它找不到它。我不知道如何使它找到它,但 – SnakeDoc

回答

2

您可以在String參數的開頭加上/在classpath的根目錄

scene.getStyleSheets().add(Main.class.getResource("/res/application.css").toExternalForm(); 

否則的路徑被解析爲搜索資源相對於Main所在的軟件包而言。解析資源的規則是explained in the javadoc

如果您想實際修改文件,這並不理想。在這種情況下,您應該從文件系統獲取文件。

Path path = Paths.get("/path/to/file");  
scene.getStyleSheets().add(path.toUri().toURL()).toExternalForm(); 
+0

可以詳細說明爲什麼它不是理想的直接加載(例1),如果我打算使其用戶可編輯(比較示例2)? – SnakeDoc

+0

@SnakeDoc首先,你不能從'URL'獲得'OutputStream'(你可以得到路徑並使用'File'或'Path',但是meh)。其次,如果你從'jar'運行你的應用程序會發生什麼? –

+0

嗯,有趣的一點。我打算將程序打包成一個罐子。我會給你的第二個例子試一試 – SnakeDoc

相關問題