2010-11-29 57 views
33

我正在使用以下來獲取此特定文件的URL,但它返回null。有沒有人有任何關於這個問題的建議或另一種方式來做到這一點?Java - class.getResource返回null

URL url = ExchangeInterceptor.class.getResource("GeoIP.dat"); 

回答

4

不,這是正確的方法afaik。確保資源在您的類路徑中。這通常是這些類型問題的原因。

25

該路徑是相對於classpath根目錄的,如果你沒有給出絕對路徑,它將與你正在使用的類(在本例中爲ExchangeInterceptor)在同一個包中查找。要找到根中使用的東西,請使用/GeoIP.dat

+2

這真的是答案。其他一切只是有點荒謬。除了IntelliJ提示。 – Schultz9999 2015-01-05 21:57:30

1

你把這個GeoIP.dat放在哪裏?在與ExchangeInterceptor相同的包中,或在「根」包中。如果在同一個包中,你的代碼是OK的,如果在根目錄下 - 添加'/'前綴。

也許您正在使用M2Eclipse?如果配置不正確,也可能導致此類問題。這樣的問題的另一個原因可能是:錯誤配置的類加載器,配置錯誤的OSGi,...

2

萬一有人仍然有問題,要明白:

.getResource()授予您訪問本地bin文件夾。這意味着,您的資源需要位於YourProject/bin/package /中。根文件夾是YourProject/bin /,可以通過在字符串參數中添加前綴/來加以識別,就像iirekm所說的那樣。

+3

它並沒有指向特定的文件夾。它只是指向類路徑。你應該看到它:你正在談論的bin文件夾是運行時類路徑的一部分。 – BalusC 2012-04-22 23:15:08

+0

好吧,我也嘗試過使用相同的方法,並得到與原始海報相同的錯誤。我通過將文件添加到我提到的路徑來修復它,所以我認爲我應該分享這個「發現」 – merovin 2012-04-22 23:45:53

+2

您剛剛發現了類路徑的其中一個路徑。 OP已經在類路徑中,OP只是用錯誤的路徑訪問它。 – BalusC 2012-04-23 01:10:11

-2

首先,您需要確保您在正確的路徑上訪問正確的文件。你可以通過getClass()。getResource(「GeoIP.dat」)。getAbsolutePath()來驗證。

其次,路徑說明符區分大小寫,所以請確保您的文件未被命名爲「geoIP.dat」或「GeoIP.DAT」。

+2

你會得到NullRef,因爲`getResource`返回`null`,請記住? – Schultz9999 2015-01-05 21:58:09

36

對於那些使用Intellij Idea:檢查設置 - >編譯器 - >資源模式

該設置包含應解釋爲資源的所有擴展名。如果擴展不符合這裏的任何模式,那麼class.getResource將爲使用此擴展的資源返回null。

+1

我一直在使用IDEA超過10年,甚至從來不知道這個設置。謝謝! – 2014-01-21 17:28:35

1

的文件需要在類路徑,例如: -

斌/我的/包/ GeoIP.dat

的/前綴似乎是一個謊言。以下將起作用。

URL url = ExchangeInterceptor.class.getResource("my/package/GeoIP.dat"); 

我懷疑問題是你沒有在類路徑中的文件。

14

使用類ClassLoader

URL url = ExchangeInterceptor.class.getClassLoader().getResource("GeoIP.dat"); 
-3

getResource方法在的情況下。

只是一個提示。你的代碼可能是正確的,但你的jre配置不是。我遇到了同樣的錯誤,沒有任何幫助,直到我檢查了日食設置。

請確保您正確設置了執行環境。

Preferences -> Java -> Installed JREs -> use "jdk..." as compatible JRE 
4

我通過指出IDEA上的resource root解決了這個問題。

最初的目錄是如此和圖標是在一個目錄中一個普通的文件夾圖標

以前

enter image description here

Right click(或只是工程名) - >Mark directory As - >Resource Root

after

重新編譯&歡喜:P

0

雖然使用的是IntelliJ,我生成該項目作爲一個JavaFX應用程序,然後添加Maven的框架支持它。事實證明,我將資源置於src/main/resources,並且必須在代碼中使用它們的每個資源名稱後面添加./

也如前面的答案中所述,只有通過classLoader加載資源才起作用。

所以對我來說,最終的URL裝載用做:

URL url = getClass().getClassLoader().getResource(String.format(".%ssample.fxml", File.separatorChar));

File.separatorChar回報/在* nix和\在Windows上。

1

如果您使用搖籃和IntelliJ,改變Resource patterns沒有工作,你的資源的根設置是否正確......你可以試試這個:

enter image description here

Settings > Build, Execution, Delpoyment > Build Tools > Gradle > Runner > Delegate IDE build/run actions to gradle 。 (IntelliJ 2017.3.3)

來源:https://youtrack.jetbrains.com/issue/IDEA-176738#comment=27-2518612