日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【Java后端】三目运算符失效问题刨根问底(及NPE分析)

發布時間:2024/10/6 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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]中做出一些規定,部分內容如下:

# JDK7 規范 If the second and third operands have the same type (which may be the null type), then that is the type of the conditional expression. If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion (§5.1.7) to T, then the type of the conditional expression is T.

翻譯一下:如果表達式 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分析)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。