在Java中需要加載一個文件時,使用getResource()方法進行加載,會報錯
[Caused by: java.lang.NullPointerException: Location is required.
這是對.getClass().getClassLoader().getResource()和.getClass().getResource()的理解不夠深入的原因。
經過查詢相關資料后終於明白,區別主要如下:
-
.getClass().getResource(fileName) :表示只會在當前調用類所在的同一路徑下查找該fileName文件;
-
.getClass().getClassLoader().getResource(fileName):表示只會在根目錄下(/)查找該文件;
-
fileName如果是前面加“/”,如"/fileName",則表示絕對路徑,取/目錄下的該文件;
如果是前面沒有加“/”,如"fileName",則表示相對路徑,取與調用類同一路徑下的該文件。 -
如果路徑中包含包名 ,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")