【Java后端】三目运算符失效问题刨根问底(及NPE分析)
我的開發問題記錄里有這么一個問題,當時項目著急就沒用三目,也沒查找原因,那時的bean.getCounter()返回值也不知道是啥了,沒有關系,咱們徹底分析一下這個問題。
// 三目失效 String counter = bean.getCounter() == "1" ? "第一次" : "第二次";1.認識三目運算符
三目運算符,官方英文名稱:Conditional Operator ? : 中文直譯條件表達式。三目運算符的基本用法非常簡單,它由三個操作數的運算符構成,形式為:
<表達式 1>?<表達式 2>:<表達式 3>- 三目運算符從左往右計算,首先計算表達式 1 ,其結果類型必須為 Boolean 或 boolean,否則發生編譯錯誤。
- 當表達式 1 的結果為 true,將會執行表達式 2,否則將會執行表達式 3。
- 表達式 2 與表達式 3 最后的類型必須得有返回結果,即不能為是 void,若為 void ,編譯時將會報錯。
- 最后需要注意的是,表達式 2 與表達式 3 不會被同時執行,兩者只有一個會被執行。
2.三目運算符使用規范
以下是阿里巴巴Java開發手冊泰山版對三目使用規范的描述:
第一種情況:
三目運算符表達式發生自動拆箱,官方在 「The Java Language Specification(簡稱:JLS)」15.25 節[1]中做出一些規定,部分內容如下:
翻譯一下:如果表達式 2 與表達式 3 類型相同,那么這個不用任何轉換,三目運算符表達式結果當然與表達式 2,3 類型一致。當表達 2 或表達式 3 其中任一一個是基本數據類型,比如 int,而另一個表達式類型為包裝類型,比如 Integer,那么三目運算符表達式結果類型將會為基本數據類型,即int。
第二種情況:
Otherwise, binary numeric promotion (§5.6.2[2]) is applied to the operand types, and the type of the conditional expression is the promoted type of the second and third operands. Note that binary numeric promotion performs value set conversion (§5.1.13[3]) and may perform unboxing conversion (§5.1.8[4]).翻譯一下:當表達式 2 與表達式 3 類型不一致,但是都為數字類型時,低范圍類型將會自動轉為高范圍數據類型,即向上轉型。這個過程將會發生自動拆箱。
3.三目失效問題分析
為了寫這篇文章,我敲了多個demo反復測試,想要復現當時的問題,各種嘗試最終都失敗了,我猜測當時出現失效現象的可能原因是表達式1,測試的時候我也是在表達式1上反復做文章,發現做不出文章來(掩面淚目)。
4.總結
三目看似簡單,還是有坑的,就像運算符的短路機制,不知道的時候都是淚。
總結
以上是生活随笔為你收集整理的【Java后端】三目运算符失效问题刨根问底(及NPE分析)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java使用正则表达式去掉小数类型字符串
- 下一篇: 【Windows部署】首次安装的谷歌Ch