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

Java 空指標異常排查:登入驗證 User 物件為 Null

     編輯:程式設計綜合問答

錯誤現象

登入驗證用戶名是否存在,呼叫 `userService.findByUsername(username)`,若用戶不存在返回 `null`。後續代碼直接呼叫 `user.getPassword()` 拋出 `NullPointerException` (第 34 行)。

NPE 堆疊截圖

錯誤代碼片段


User user = userService.findByUsername(username); // 第 32 行
// 缺少 null 判斷!
if (user.getPassword().equals(inputPassword)) { // 第 34 行 NPE
    // 登入成功
}

修正方案


User user = userService.findByUsername(username);
if (user == null) {
    // 用戶不存在:回傳錯誤訊息、記錄日誌、拋出自定義異常
    return Result.error("用戶名不存在");
}

// 安全驗證密碼 (建議使用 BCrypt/SCrypt 比對,而非明文 equals)
if (passwordEncoder.matches(inputPassword, user.getPassword())) {
    // 登入成功
    return Result.success("登入成功");
} else {
    return Result.error("密碼錯誤");
}

防禦性程式設計檢查清單

  1. 所有外部呼叫返回值必須判空:Service、DAO、第三方 API、反序列化結果。
  2. 使用 `Optional` (Java 8+):`Optional.ofNullable(user).ifPresent(u -> ...)` 或 `user.orElseThrow(...)`。
  3. 契約式設計:在方法 Javadoc 明確標註 `@return 可能為 null` 或 `@return never null`。
  4. 單元測試覆蓋 Null 路徑**:Mock 服務返回 null,驗證 Controller/Service 正確處理。
  5. 靜態分析工具**:SpotBugs, SonarQube, Error Prone (編譯期) 可自動檢測潛在 NPE。

結論

**NPE 核心原因:信任了可能為 null 的引用而未判空。** 第 32 行 `userService.findByUsername()` 返回 `null` (用戶不存在),第 34 行直接解引用導致崩潰。**務必在使用前判空**,或用 `Optional`/異常流程明確處理「不存在」業務邏輯。

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