數(shù)據(jù)類型轉(zhuǎn)化異常問題很難解決?!一文帶你梳理處理方式!
我們?cè)陂_發(fā)Java項(xiàng)目時(shí),經(jīng)常會(huì)碰到數(shù)據(jù)類型的轉(zhuǎn)化的情況,而很多初學(xué)者或經(jīng)驗(yàn)不夠的程序員,經(jīng)常會(huì)在進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換時(shí)遇到異常。數(shù)據(jù)類型轉(zhuǎn)換異常雖然是看似簡單的錯(cuò)誤,但帶來的后果卻是不可估量的。所以今天千鋒老謝就來給大家講一下數(shù)據(jù)類型轉(zhuǎn)化過程中產(chǎn)生的問題該如何解決,以及其他需要注意的地方。
一、顯式類型轉(zhuǎn)換產(chǎn)生的異常
首先我們來看下面這個(gè)具體的需求,范某某因?yàn)橥刀惵┒惐涣P款8.83億,如果程序這么寫:
如果我們直接這樣進(jìn)行簡單的數(shù)據(jù)類型轉(zhuǎn)化,那范某某可就高興了,因?yàn)樗幌伦泳涂梢怨?jié)省0.83億!0.83億,這可是8300萬啊,多么龐大的數(shù)字,一下子就省出來了!
所以這種數(shù)據(jù)類型轉(zhuǎn)化雖然不會(huì)出現(xiàn)代碼錯(cuò)誤,但肯定是無法滿足業(yè)務(wù)需求的,因?yàn)檫@在浮點(diǎn)數(shù)轉(zhuǎn)化整數(shù)的過程中會(huì)自動(dòng)舍去小數(shù),造成數(shù)據(jù)失真!
二、隱式類型提升產(chǎn)生的異常
除了上述這種直接數(shù)據(jù)類型轉(zhuǎn)化的操作會(huì)導(dǎo)致數(shù)據(jù)精度丟失之外,下面這種計(jì)算也可能會(huì)讓數(shù)據(jù)出現(xiàn)錯(cuò)誤情況。
在我們平時(shí)的印象中,int類型和double類型進(jìn)行計(jì)算,結(jié)果應(yīng)該為double類型數(shù)據(jù),這是不能夠使用int類型接收計(jì)算結(jié)果的。
但如果我們使用自增符號(hào)(+=)卻可以通過編譯,并且會(huì)去除小數(shù)得到一個(gè)整數(shù),這也是我們平時(shí)可能容易忽略的地方,這里也可能會(huì)造成嚴(yán)重的后果的一個(gè)小細(xì)節(jié)。
三、數(shù)據(jù)范圍越界產(chǎn)生的異常
另外我們可能也會(huì)碰到下面這樣的異常情況:第一行不報(bào)錯(cuò),第三行報(bào)錯(cuò)
之所以會(huì)產(chǎn)生上述情況,我們首先要看看兩個(gè)值分別是多少,l變量值為10億,ll變量值為100億,這是第一點(diǎn)。
第二點(diǎn),兩個(gè)變量的數(shù)據(jù)類型都是long,但定義的值后面沒有加L或者l,所以此時(shí)這兩個(gè)變量默認(rèn)的數(shù)據(jù)類型就是int。
而我們知道,最后int數(shù)據(jù)類型的最大范圍為21億多,第三行100億明顯超出了int的長度范圍,所以第一行數(shù)據(jù)可以正常的進(jìn)行數(shù)據(jù)類型轉(zhuǎn)化,但第三行卻報(bào)錯(cuò)了。
老謝通過上面的3個(gè)案例,為大家分析了數(shù)據(jù)類型轉(zhuǎn)換時(shí)可能會(huì)導(dǎo)致異常的幾種常見情況,現(xiàn)在你知道該如何避免這些異常問題了嗎?請(qǐng)持續(xù)關(guān)注我們的文章,這里會(huì)為你帶來更多精彩的java學(xué)習(xí)內(nèi)容哦!