[轉載] JAVA條件表達式的陷阱

參考鏈接: Java條件表達式中的數字類型提升

Map<String, Integer> map = new HashMap<String, Integer>();? ?map.put("count", null);? ?Integer it = map == null ? 0 : map.get("count");? 注意:在第三行,會拋出java.lang.NullPointerException信息。因為分析:表達式二的類型為int,整個表達式類型為 Integer,JDK5.0會自動打包,所以表達式三 會獲得一個Integer,然后轉成int,再轉成Integer,如果是NULL在轉成int的時候拋出空指針異常。?

? 下面的程序將會打印出什么呢??

? public class DosEquis{? ? ?public static void main(String[] args){? ? ?char x = 'X';? ? ?int i = 0;? ? ?System.out.println(true ? x : 0);? ? ?System.out.println(false ? i : x);? ? ? }? ?}? ?這個程序由兩個變量聲明和兩個print語句構成。第一個print語句計算條件表達式(true ? x : 0)并打印出結果,這個結果是char類型變量x的值’X’。而第二個print語句計算表達式(false ? i : x)并打印出結果,這個結果還是依舊是’X’的x,因此這個程序應該打印XX。? ? ? 然而,如果你運行該程序,你就會發現它打印出來的是X88。這種行為看起來挺怪的。第一個print語句打印的是X,而第二個打印的卻是88。它們的不同行為說明了什么呢?? ? ? 答案就在規范有關條件表達式部分的一個陰暗的角落里。請注意在這兩個表達式中,每一個表達式的第二個和第三個操作數的類型都不相同:x是char類型的, 而0和i都是int類型的。混合類型的計算會引起混亂,而這一點比在條件表達式中比在其它任何地方都表現得更明顯。你可能考慮過,這個程序中兩個條件表達 式的結果類型是相同的,就像它們的操作數類型是相同的一樣,盡管操作數的順序顛倒了一下,但是實際情況并非如此。? ? ? 確定條件表達式結果類型的規則過于冗長和復雜,很難完全記住它們,但是其核心就是一下三點: 1、如果第二個和第三個操作數具有相同的類型,那么它就是條件表達式的類型。換句話說,你可以通過繞過混合類型的計算來避免×××煩。? 2、如果一個操作數的類型是T,T表示byte、short或char,而另一個操作數是一個int類型的常量表達式,它的值是可以用類型T表示的,那么條件表達式的類型就是T。? 3、否則,將對操作數類型運用二進制數字提升,而條件表達式的類型就是第二個和第三個操作數被提升之后的類型。? ? ? 2、3兩點是關鍵。在程序的兩個條件表達式中,一個操作數的類型是char,另一個的類型是int。在兩個表達式中,int操作數都是0,它可以被表示成 一個char。然而,只有第一個表達式中的int操作數是常量(0),而第二個表達式中的int操作數是變量(i)。因此,第2點被應用到了第一個表達式 上,它返回的類型是char,而第3點被應用到了第二個表達式上,其返回的類型是對int和char運用了二進制數字提升之后的類型,即int。? ? ? 條件表達式的類型將確定哪一個重載的print方法將被調用。對第一個表達式來說,print(char)將被調用,而對第二個表達式來 說,PrintStream.print(int)將被調用。前一個重載方法將變量x的值作為Unicode字符(X)來打印,而后一個重載方法將其作為 一個十進制整數(88)來打印。? ? ? 總之,通常最好是在條件表達式中使用類型相同的第二和第三操作數。否則,你和你的程序的讀者必須要徹底理解這些表達式行為的復雜規范。? ? ? 對 語言設計者來說,也許可以設計一個犧牲掉了部分靈活性,但是增加了簡潔性的條件操作符。例如,要求第二和第三操作數必須就有相同的類型,這看起來就很合 理。或者,條件操作符可以被定義為對常量沒有任何特殊處理。為了讓這些選擇對程序員來說更加容易接受,可以提供用來表示所有原始類型字面常量的語法。這也 許確實是一個好注意,因為它增加了語言的一致性和完備性,同時又減少了對轉型需求。

??

?

轉載于:https://blog.51cto.com/3470969/1126884

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540243.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540243.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux系統管理初步(七)系統服務管理、chkconfig與systemd 編輯中

Linux系統本身包含了很多服務&#xff0c;CentOS6之前系統的服務用SysV控制&#xff0c;CentOS7改為systemd控制 一、chkconfig服務管理機制 簡而言之&#xff0c;chkconfig就是CentOS6以前用來控制系統服務的工具&#xff0c; 常用方法舉例 chkconfig --list #列出所有的系統服…

[轉載] 菜鳥舉例理解字節流和字符流區別

參考鏈接&#xff1a; Java中的字符流與字節流 Character Stream對比Byte Stream 菜鳥舉例理解字節流和字符流區別 按照uft8編碼方式存儲文檔 文檔存儲路徑在D盤下 /** * 按照utf8格式存儲文檔 */ public static void storeDataByUTF8(){ String path "D:" …

[轉載] Java9發布回顧Java 8的十大新特性

參考鏈接&#xff1a; Java中的DoubleStream mapToObj() java9已經在北京時間9月22日正式發布&#xff0c;開發者可以在oracle jdk官網上下載到最新的jdk9。 今天&#xff0c;我們先來一起復習一下2014年發布的Java 8的十大新特性。先來喝杯java~~~ 按照java升級的傳統&…

窗體間傳遞數據

前言 做項目的時候&#xff0c;winfrom因為沒有B/S的緩存機制&#xff0c;窗體間傳遞數據沒有B/S頁面傳遞數據那么方便&#xff0c;今天我們就說下winfrom中窗體傳值的幾種方式。 共有字段傳遞 共有字段傳遞實現起來很方便&#xff0c;就是在窗體類中加個共有字段屬性&#xff…

[轉載] c語言中檢查命令行參數_C中的命令行參數

參考鏈接&#xff1a; Java中的命令行參數 c語言中檢查命令行參數 Command line argument is a parameter supplied to the program when it is invoked. Command line argument is an important concept in C programming. It is mostly used when you need to control your …

MySQL關閉Enterprise Server源碼

今天從MySQL官方網站上獲知&#xff0c;MySQL宣布關閉Enterprise Server的源碼&#xff0c;對于廣大開源愛好者來說&#xff0c;這是一個沉重的打擊。雖然免費的用戶群體一般僅僅使用MySQL Community Server&#xff08;開源免費社區版&#xff09;&#xff0c;但關閉MySQL Ent…

[轉載] Java中Scanner用法總結

參考鏈接&#xff1a; Java之Scanner類 最近在做OJ類問題的時候&#xff0c;經常由于Scanner的使用造成一些細節問題導致程序不通過&#xff08;最慘的就是網易筆試&#xff0c;由于sc死循環了也沒發現&#xff0c;導致AC代碼也不能通過。。。&#xff09;&#xff0c;因此對S…

os和shutil模塊

import os //os模塊基本實現了linux系統中所有的命令 os.system(終端命令)&#xff1a;在終端執行命令 os.getcwd():獲取當前的工作路徑 os.chdir():修改工作路徑 os.chmod():修改權限 os.chown():修改屬主屬組 os.mkdir():創建單個目錄&#xff0c;當目錄存在時報異常&…

[轉載] JAVA語言程序設計(基礎篇)第十版課后題答案(第一章)

參考鏈接&#xff1a; Java中的Scanner和nextChar() JAVA語言程序設計&#xff08;基礎篇&#xff09;第十版課后題答案 第一章 第二題 /** Created by ysy on 2018/7/6. */ public class text2 { public static void main(String[] args){ for(int i 0; i < 5; i) Syste…

java.util.Date和java.sql.Date 一點區別

最近無意中發現&#xff0c;在oracle中同一樣的一個Date類型字段&#xff0c;存儲的日期格式有兩種不同的情況&#xff0c;第一種是2011-1-1 12:00:00&#xff0c;第二種是2011-1-1&#xff0c;仔細查找發現在向數據庫中寫數據的時候定義的變量的問題。 第一種是&#xff1a;ja…

[轉載] java中關于用\t格式輸出

參考鏈接&#xff1a; 用Java格式化輸出 看了好多人關于\t的用法&#xff0c;感覺找不到自己想要的答案&#xff0c;所以索性就自己輸出來看看&#xff0c;如圖&#xff1a;這樣可以一目了然的看出來&#xff0c;\t&#xff08;制表符&#xff09;的作用就是看前面輸出滿不滿8…

微信搶房軟件開發

2019獨角獸企業重金招聘Python工程師標準>>> 這兩年樓市真可謂是一個"火“字難以形容 經歷了長沙兩次開盤&#xff0c;都沒有搶到&#xff0c;目前還沒有買到房子&#xff0c;說說我的悲劇吧&#xff0c;讓大伙都開心開心 第一次搶房是今年4月份長沙萬科金域國…

[轉載] Java——數組習題

參考鏈接&#xff1a; Java從控制臺讀取輸入的方法 package chap02; import java.util.Scanner; /** * * author admin * date 2020-4-8 * description: * 題目內容&#xff1a; 編寫程序&#xff0c; 從控制臺讀取下面的信息&#xff0c; 每月按22天工作日計算&#xff0c;…

超全Linux備份工具集合,滿足你的所有需要!

經常備份計算機上的數據是個好的做法&#xff0c;它可以手動完成&#xff0c;也可以設置成自動執行。許多備份工具擁有不同的功能特性&#xff0c;讓用戶可以配置備份類型、備份時間、備份對象、將備份活動記入日志及執行更多操作。 1.Rsync這是一款在Linux用戶當中頗受歡迎的命…

[轉載] Java內存管理-你真的理解Java中的數據類型嗎(十)

參考鏈接&#xff1a; Java中的字符串類String 1 做一個積極的人 編碼、改bug、提升自己 我有一個樂園&#xff0c;面向編程&#xff0c;春暖花開&#xff01; 推薦閱讀 第一季 0、Java的線程安全、單例模式、JVM內存結構等知識梳理 1、Java內存管理-程序運行過程&#x…

Linux系統安全加固腳本

閑來無事&#xff0c;整理一個系統安全加固腳本&#xff0c;每個公司的要求不一樣&#xff0c;所以僅供參考&#xff1a; #!/bin/sh echo "00 */1 * * * /usr/sbin/ntpdate 192.168.1.1 >>/var/log/ntpdate.log" > mycrontab crontab mycrontab rm -rf my…

[轉載] 整理下java中stringBuilder和stringBuffer兩個類的區別

參考鏈接&#xff1a; Java中的StringBuffer類 StringBuilder和StringBuffer這兩個類在動態拼接字符串時常用&#xff0c;肯定比String的效率和開銷小&#xff0c;這是因為String的對象不會回收哦。 其實我一直用StringBuilder這個類&#xff0c;因為可以簡寫為sb的變量在程序…

11.13 模10計數器設計

.新建一個工程 Family&#xff1a;FLEX10K Available device&#xff1a;EPF10K20TC144-3 2.設置lpm_counter宏單元參數并連接引腳 連接引腳的時候要注意的是&#xff0c;向量線的連接。 3.時序仿真 檢查無誤后進行下一步 4.載入7448并進行引腳連接 5.分配管腳 再次編譯&#x…

[轉載] java對象在內存中的結構

參考鏈接&#xff1a; 了解Java中的類和對象 今天看到一個不錯的PPT&#xff1a;Build Memory-efficient Java Applications&#xff0c;開篇便提出了一個問題&#xff0c;在Hotspot JVM中&#xff0c;32位機器下&#xff0c;Integer對象的大小是int的幾倍&#xff1f; 我們…

使用valueOf前必須進行校驗

每個枚舉都是java.lang.Enum的子類,都可以訪問Enum類提供的方法,比如hashCode(),name(),valueOf()等..... 其中valueOf()方法會把一個String類型的名稱轉變為枚舉項,也就是枚舉項中查找出字面值與該參數相等的枚舉項,雖然這個方法很簡單,但是JDK卻做了一個對于開發人員來說并不…