Java中getClassLoader().getResource()和getResource()的區別


在Java中需要加載一個文件時,使用getResource()方法進行加載,會報錯

[Caused by: java.lang.NullPointerException: Location is required.

這是對.getClass().getClassLoader().getResource()和.getClass().getResource()的理解不夠深入的原因。

經過查詢相關資料后終於明白,區別主要如下:

  1. .getClass().getResource(fileName) :表示只會在當前調用類所在的同一路徑下查找該fileName文件;

  2. .getClass().getClassLoader().getResource(fileName):表示只會在根目錄下(/)查找該文件;

  3. fileName如果是前面加“/”,如"/fileName",則表示絕對路徑,取/目錄下的該文件;
    如果是前面沒有加“/”,如"fileName",則表示相對路徑,取與調用類同一路徑下的該文件。

  4. 如果路徑中包含包名 ,getClass().getResource("com/xxx/1.xml");
    包名的層級使用"/"隔開(正斜杠),而非“.”(半角句號)。

舉例:
包com.aaa下有調用類A,需要引用配置文件1.xml:

1. 配置文件在包com.aaa下

getClass().getResource("1.fxml") ——成功
getClass().getResource("/1.fxml")——失敗
getClass().getClassLoader().getResource("1.fxml")——失敗
getClass().getClassLoader().getResource("/1.fxml")——失敗

第2條失敗,原因是使用了絕對路徑,路徑不正確(/目錄下沒有該文件)。應為:

getClass().getResource("/com/aaa/1.fxml")
(com前有"/",表示絕對目錄,從/目錄開始)

第3條失敗是因為相對路徑不正確,應為:

getClass().getClassLoader().getResource("com/aaa/1.fxml")
(此處注意com前面沒有“/”,因為getClassLoader()已經表示/目錄)

第4條失敗是絕對路徑不正確,因為當前已在/目錄下,再使用/1.fxml就出錯。可以改為如下:

getClass().getClassLoader().getResource("./1.fxml")

2.配置文件在根目錄下

getClass().getResource("1.fxml") ——失敗
getClass().getResource("/1.fxml")——成功
getClass().getClassLoader().getResource("1.fxml")——成功
getClass().getClassLoader().getResource("/1.fxml")——失敗

第1條是使用相對路徑,路徑不正確所以失敗,應為:

getClass().getResource("../../1.fxml")

第4條失敗是因為當前路徑已經為/。可以使用:

getClass().getClassLoader().getResource("./1.fxml")




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM