if (uname != null && pwd != null && !uname.equals("") && !pwd.equals("")) {
// 進行登入驗證邏輯
} else {
throw new NameNullException("用戶名或密碼為空,請重新輸入");
}
| 條件 | 檢查目的 | 說明 |
|---|---|---|
uname != null | 防止呼叫 null.equals() 拋出 NullPointerException | 必須放在最前面,利用短路特性保護後續呼叫 |
pwd != null | 同理,保護密碼欄位 | |
!uname.equals("") | 檢查用戶名不是空字串 | 使用者可能輸入了空白再送出,或前端未攔截空值 |
!pwd.equals("") | 檢查密碼不是空字串 |
null 與 ""?在 Java 中,String 變數可能有三種狀態:
"":物件存在,但長度為 0(使用者按下送出但未輸入內容)。打個比方:null 就像「沒帶錢包出門」,空字串就像「帶了錢包但裡面沒錢」。兩種情況都無法付款(登入),所以必須分別檢查。
Java 的 && 具備短路特性:
uname == null,第一個條件為 false,後續條件完全不會執行,直接進入 else 區塊。uname.equals("") 永遠不會在 uname == null 時被呼叫,避免 NPE。這就是為何順序必須是:null 檢查 → 空字串檢查 → 業務邏輯。
isBlank()if (uname != null && !uname.isBlank() && pwd != null && !pwd.isBlank()) {
// isBlank() 同時涵蓋 ""、空白字元、tab、換行等
}
StringUtils.hasText()if (StringUtils.hasText(uname) && StringUtils.hasText(pwd)) {
// 內部已處理 null、trim、長度檢查
}
| 錯誤寫法 | 問題 | 修正 |
|---|---|---|
uname != "" | 字串比較應用 equals(),!= 比較參考位址 | !uname.equals("") 或 !uname.isEmpty() |
uname.equals("") 放在 uname != null 前 | 若 uname 為 null 直接拋 NPE | 調整順序利用短路保護 |
只檢查 != null 不檢查空字串 | 允許空字串通過驗證 | 補上 !isEmpty() 或 !isBlank() |
!uname.equals("") 的作用是排除空字串輸入,配合前面的 null 檢查與短路求值,構成完整的「非空驗證」防線。初學者應養成「先檢 null、再檢內容」的習慣,並善用 isBlank() 或工具類簡化程式碼。