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

Java 三元運算符嵌套判斷空對象:優先級陷阱與正確括號分組

     編輯:程式設計綜合問答

問題代碼


// 住院非空處理,否則判斷門診
zyyzjymx != null ? f1(zyyzjymx) : mzzdjymx != null ? f1(mzzdjymx) : null;
// 編譯錯誤或邏輯錯誤:三元運算符右結合,實際解析為
zyyzjymx != null ? f1(zyyzjymx) : (mzzdjymx != null ? f1(mzzdjymx) : null);

正確寫法:顯式括號分組


zyyzjymx != null ? (f1(zyyzjymx)) : (mzzdjymx != null ? f1(mzzdjymx) : null);
// 或拆分為 if-else 可讀性更強
if (zyyzjymx != null) {
    f1(zyyzjymx);
} else if (mzzdjymx != null) {
    f1(mzzdjymx);
}

三元運算符優先級與結合性

  • 優先級:低於賦值 `=`,高於 Lambda `->`。
  • 結合性:**右結合** (Right-to-Left)。`a ? b : c ? d : e` 等價於 `a ? b : (c ? d : e)`。
  • 嵌套時**必須加括號**明確意圖,否則極易產生邏輯錯誤。

最佳實踐建議

  1. 簡單單層三元:`condition ? expr1 : expr2` 可接受。
  2. 嵌套/多層判斷:改用 `if-else if-else` 或提取方法,可讀性優於縮減行數。
  3. 表達式體方法 (Java 12+ Switch 表達式):
    
    Object result = switch (true) {
        case boolean b when zyyzjymx != null -> f1(zyyzjymx);
        case boolean b when mzzdjymx != null -> f1(mzzdjymx);
        default -> null;
    };
    
  4. Optional 鏈式調用 (Java 8+):
    
    Optional.ofNullable(zyyzjymx)
        .or(() -> Optional.ofNullable(mzzdjymx))
        .ifPresent(this::f1);
    

三元運算符嵌套是「寫時讀懂,改時崩潰」的典型反模式,**顯式括號或重構為語句** 是專業選擇。

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