登入驗證用戶名是否存在,呼叫 `userService.findByUsername(username)`,若用戶不存在返回 `null`。後續代碼直接呼叫 `user.getPassword()` 拋出 `NullPointerException` (第 34 行)。
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("密碼錯誤");
}
**NPE 核心原因:信任了可能為 null 的引用而未判空。** 第 32 行 `userService.findByUsername()` 返回 `null` (用戶不存在),第 34 行直接解引用導致崩潰。**務必在使用前判空**,或用 `Optional`/異常流程明確處理「不存在」業務邏輯。