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

Java 入門:解析 if 條件中 `!uname.equals("")` 的用途與短路求值機制

     編輯:程式設計綜合問答

程式碼片段回顧

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 變數可能有三種狀態:

  1. null:參考尚未指向任何物件(如未初始化、請求參數缺失)。
  2. 空字串 "":物件存在,但長度為 0(使用者按下送出但未輸入內容)。
  3. 非空字串:正常輸入值。

打個比方:null 就像「沒帶錢包出門」,空字串就像「帶了錢包但裡面沒錢」。兩種情況都無法付款(登入),所以必須分別檢查。

短路求值 保護機制

Java 的 && 具備短路特性:

  • 若 uname == null,第一個條件為 false,後續條件完全不會執行,直接進入 else 區塊。
  • 因此 uname.equals("") 永遠不會在 uname == null 時被呼叫,避免 NPE。

這就是為何順序必須是:null 檢查 → 空字串檢查 → 業務邏輯。

現代寫法建議

Java 11+ 使用 isBlank()

if (uname != null && !uname.isBlank() && pwd != null && !pwd.isBlank()) {
    // isBlank() 同時涵蓋 ""、空白字元、tab、換行等
}

使用 Apache Commons Lang / Spring 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() 或工具類簡化程式碼。

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