2022年第一個(gè)線上問題,被領(lǐng)導(dǎo)罵慘了!
hi 大家好,我是田哥
全職做面試輔導(dǎo)和技術(shù)支持的田哥。
昨天,一位朋友說他們生產(chǎn)環(huán)境出bug了,哎,年底了,今年的年終獎(jiǎng)估計(jì)涼涼了!
這位朋友剛剛出道不久,出了問題,第一時(shí)間找的我。
他把出問題的代碼發(fā)我了,叫我?guī)退鹯eview這段代碼。
for?(ProductOrderItem?orderItem?:?orderItemList)?{
????if?(orderItem.getProductOrderItem_user().getUser_id()?!=?user.getUser_id())?{
???????logger.warn("用戶訂單項(xiàng)與用戶不匹配,回到購物車頁");
???????return?"redirect:/cart";
????}
????if?(orderItem.getProductOrderItem_order()?!=?null)?{
????????logger.warn("用戶訂單項(xiàng)不屬于購物車,回到購物車頁");
????????return?"redirect:/cart";
????}
}
看這段代碼,不是很簡單嗎?
我只能盲猜了
是不是兩個(gè)user_id不一樣,數(shù)據(jù)有問題導(dǎo)致的? 你這user_id是Integer類型? 或者是 orderItem.getProductOrderItem_order()不等null?
我讓他debug看看,過一會(huì),他說奇了怪了,并甩給我一個(gè)截圖:



看到最后這張截圖,就不用想了,在判斷兩個(gè)user_id不相等的地方,我猜測IDEA編輯器已經(jīng)提示他了。兩邊都是Integer,屬于int的包裝類,也就是兩個(gè)Integer對(duì)象,你用!=去比較,這不是扯淡么?
況且,人家IDEA編輯器會(huì)這么提示的:

都明確提示使用equals()來做對(duì)象比較,假裝沒見,這鍋,沒人替你背了!
使用IDEA編輯器開發(fā)的朋友,田哥建議你多看看IDEA給你的代碼提示
問題來源
暫且不討論他這代碼寫的很讓人不爽,怎么有的駝峰,有的下劃線?難道你們項(xiàng)目就沒有管這個(gè)嗎?讓你瞎寫,想干啥就干啥。我也問了,這位小伙伴是在一家小公司,在搞一個(gè)電商項(xiàng)目,由于急著上線,所以也沒顧忌到那么多。
在此,也希望大家養(yǎng)成一個(gè)良好習(xí)慣,不要再這么編碼,對(duì)團(tuán)隊(duì)負(fù)責(zé)也是對(duì)自己負(fù)責(zé)!
這位小伙伴出的問題,根本原因在于使用!=沒有使用equals()導(dǎo)致的。
故事還沒結(jié)算
就算使用!=,在本地測試和測試環(huán)境,也都沒問題!

自己本地測試,用戶數(shù)量就幾十個(gè),測試環(huán)境也估計(jì)只有幾十個(gè),但是線上就不止幾十個(gè)了,于是就這個(gè)bug就順利暴露出來了!
最后,其實(shí)測試的小伙伴這會(huì)也要跟著背鍋!
請(qǐng)看下面這段代碼,將輸出什么結(jié)果?
public?class?Test?{
????public?static?void?main(String[]?args)?{
????????Integer?aa=100;
????????Integer?bb=100;
????????System.out.println(aa==bb);
????????Integer?cc=128;
????????Integer?dd=128;
????????System.out.println(cc==dd);
????????Integer?ee=129;
????????Integer?ff=129;
????????System.out.println(ee==ff);
????}
}
這又聊到了Integer的知識(shí)盲區(qū),因?yàn)镮nteger對(duì)-128~127做了緩存。

關(guān)于Integer的相關(guān)內(nèi)容,之前已跟大家分享給了。
于是,上面的那段代碼輸出如下:
true
false
false
后記
我們?cè)趯?duì)象比較的時(shí)候,一定記得使用equals來比較(有點(diǎn)開發(fā)經(jīng)驗(yàn)的朋友都知道),但剛出道的朋友犯著錯(cuò)也是可以理解的,也希望還不太清楚的朋友,往后別再給自己挖類似的坑了。
吃一塹長一智!
也希望這位朋友也別灰心,抽時(shí)間多補(bǔ)補(bǔ)基礎(chǔ)。?

39歲阿里P9失業(yè)了,總資產(chǎn)1.5億

100行代碼透徹解析RPC原理

西安一碼通到底是通過后端下發(fā)圖片的嗎?新笑話:CPU轉(zhuǎn)速過高導(dǎo)致內(nèi)存溢出?
關(guān)注公眾號(hào)【Java技術(shù)江湖】后回復(fù)“PDF”即可領(lǐng)取200+頁的《Java工程師面試指南》
強(qiáng)烈推薦,幾乎涵蓋所有Java工程師必知必會(huì)的知識(shí)點(diǎn),不管是復(fù)習(xí)還是面試,都很實(shí)用。

