首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JDBC 使用類加載器讀取 Properties 配置文件空指針異常解析

     編輯:程式設計疑難解答

問題現場

使用 `ClassLoader.getResourceAsStream()` 讀取絕對路徑 `C:/Java/WprkSpace/JDBC/jdbc.properties` 導致 `InputStream` 為 `null`,隨後 `properties.load(in)` 拋出 `NullPointerException`。而教學視頻中使用相對路徑卻正常運行。

InputStream in = this.getClass().getClassLoader().getResourceAsStream("C:/Java/WprkSpace/JDBC/jdbc.properties");
properties.load(in); // 此處拋 NPE,in 為 null

項目結構截圖 錯誤堆棧截圖 文件位置截圖 代碼截圖

根本原因

ClassLoader 僅能加載 Classpath 下的資源(相對路徑)。絕對路徑 `C:/...` 不在 Classpath 中,`getResourceAsStream()` 返回 `null`。教學視頻中文件放在 `src/resources` 或包結構下,故相對路徑生效。

解決方案

方案一:使用相對路徑(推薦,符合規範)

  1. 將 `jdbc.properties` 放入項目 `src/main/resources` 目錄(Maven 標準)或源碼包根目錄。
  2. 代碼改為:
// 文件在 classpath 根目錄
InputStream in = this.getClass().getClassLoader().getResourceAsStream("jdbc.properties");
// 或在同包下
InputStream in = this.getClass().getResourceAsStream("jdbc.properties");

方案二:使用文件流讀取絕對路徑(不推薦,耦合環境)

FileInputStream fis = new FileInputStream("C:/Java/WprkSpace/JDBC/jdbc.properties");
properties.load(fis);
fis.close();

方案三:外部化配置(生產環境最佳)

  • 使用 Spring `@PropertySource("file:${config.path}/jdbc.properties")` 注入。
  • 或啟動參數 `-Dconfig.path=/opt/config` 指定配置目錄。

補充:關於 PC 端提問界面

CSDN 問答支持 PC 瀏覽器直接提問,無需手機。登錄後點擊頂部「提問」按鈕即可,支持懸賞 C 幣、代碼塊、圖片上傳等功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved