三目运算符_Java中的三目运算符
某日,同事給我展示了一塊代碼,問我有沒有什么問題。(代碼如下 代碼塊1):
int i = 1; Boolean a = null; boolean b = false; System.out.println(i == 1 ? a : b);集智慧與美貌于一身的我一眼就發(fā)現(xiàn)了其中的端倪:當(dāng)然會報(bào) NPE 了!
但是如果代碼變成這樣的呢(如下 代碼塊2)?
int i = 1; boolean a = true; Boolean b = null; System.out.println(i == 1 ? a : b);上述代碼塊就是正常的。
為什么呢?
這就涉及到了Java中 三目運(yùn)算符 和 自動裝箱/拆箱 的問題了。
代碼塊1會報(bào)錯(cuò)是因?yàn)闂l件滿足,取 a 的值。在取 a 的值時(shí),三目運(yùn)算符中既有基本類型,又有引用類型;JVM會幫我們把引用類型的數(shù)據(jù)轉(zhuǎn)換為基本類型。通過查看 class 文件看到如下代碼(代碼塊3):
int i = 1; Boolean a = null; boolean b = false; System.out.println(i == 1 ? a.booleanValue() : b);因?yàn)?a 是引用類型,此時(shí)調(diào)用 a 的方法就會報(bào)NPE了。
代碼塊2為什么不會報(bào)錯(cuò)呢?
此時(shí)三目運(yùn)算符中的條件滿足,直接就取 a 的值了,因?yàn)?a 是基本類型的,直接就拿來用了,所以程序正常。可以看到 class 文件如下(代碼塊4):
int i = 1; boolean a = true; Boolean b = null; System.out.println(i == 1 ? a : b.booleanValue());但在實(shí)際的業(yè)務(wù)場景中,我們的代碼不會上上述一樣是 i == 1 的寫法,大部分情況下是動態(tài)判斷的。如何避免踩進(jìn)上述的坑中呢?
其實(shí)要解決這個(gè)問題也很簡單,就是不讓JVM幫我們拆箱。即把 a 和 b 兩個(gè)對象都改為 Boolean 或 boolean,只要兩個(gè)對象統(tǒng)一就好了。
避免采坑的代碼:
int i = 1; Boolean a = Boolean.TRUE; Boolean b = Boolean.FALSE; System.out.println(i == 1 ? a : b);或
int i = 1; boolean a = true; boolean b = false; System.out.println(i == 1 ? a : b);總結(jié):
不止 Boolean/boolean 有這個(gè)問題,像 Byte / byte、Integer / int、Short / short、Long / long、Character / char、Float / float、Double / double 都會有這樣的問題。只要代碼規(guī)范一點(diǎn),就不會坑到隊(duì)友啦 ╮( ̄▽ ̄)╭
最后祝大家碼出好心情,碼出幸福人生!
總結(jié)
以上是生活随笔為你收集整理的三目运算符_Java中的三目运算符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 禁用内存清理_win10电脑开机内存占用
- 下一篇: flex java red5_使用 Fl