摘要:在以為變更已發(fā)生的時(shí)候,其實(shí)變更沒有發(fā)生。造成數(shù)據(jù)寫入失敗。免費(fèi)領(lǐng)取驗(yàn)證碼內(nèi)容安全短信發(fā)送直播點(diǎn)播體驗(yàn)包及云服務(wù)器等套餐更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)分享請(qǐng)?jiān)L問網(wǎng)易云社區(qū)。文章來源網(wǎng)易云社區(qū)
本文由作者張遠(yuǎn)道授權(quán)網(wǎng)易云社區(qū)發(fā)布。
坦白講身為程序員,bug在所難免。有人講,bug越多,說明程序員越偉大。這句話有它一定的道理。
因?yàn)閺哪撤矫嬷v,bug多了說明他的代碼量也多。
言歸正傳,這里我記錄了我曾經(jīng)犯過的幾個(gè)錯(cuò)誤。希望看到的同儕能夠見而避之。
常用的一個(gè)場(chǎng)景,遍歷一個(gè)集合,對(duì)符合某種條件的元素做修改。習(xí)慣性地會(huì)寫出如下代碼:
List testInt = new ArrayList(); testInt.add(1); testInt.add(2); testInt.add(3); for(Integer temp :testInt ){ if(temp==1) temp=temp*2; } for(Integer a:testInt ){ System.err.println(a); }
期待的結(jié)果是:
2
2
3
但實(shí)際輸出為:
1
2
3
這是很容易掉進(jìn)去的陷阱。即通過foreach遍歷對(duì)集合元素進(jìn)行修改。在以為變更已發(fā)生的時(shí)候,
其實(shí)變更沒有發(fā)生。造成數(shù)據(jù)寫入失敗。
因?yàn)?/p>
for(Integer temp:testInt){ if(temp==1) temp=temp*2; }
將被翻譯成
for(int i=0,length=testStr.size();i根據(jù)oracle的官方文檔,正式翻譯應(yīng)該如下
for (Iteratori = testInt.iterator(); i.hasNext(); ) { float i0 = (Integer)i.next(); if(i0 == 1) i0 = i0*2; }即,foreach里頭的的 temp變量只是一個(gè)局部變量,而且還是集合中元素的一個(gè)副本,并不是元素本身。
想到之前還遇到的一個(gè)問題,代碼簡(jiǎn)化如下:
Integer integer1 = 3; Integer integer2 = 3; if (integer1 == integer2) System.out.println("integer1 == integer2"); else System.out.println("integer1 != integer2"); Integer integer3 = 300; Integer integer4 = 300; if (integer3 == integer4) System.out.println("integer3 == integer4"); else System.out.println("integer3 != integer4");即在判斷整數(shù)相等時(shí),使用了封裝類(由數(shù)據(jù)庫映射過來,用封裝類防止反射異常)。實(shí)際的輸出結(jié)果如下:
integer1 == integer2
integer3 != integer4
明眼人很容易看出來,這里掉入了兩個(gè)坑.一個(gè)坑是用等號(hào)判斷相等,除非是為了比較同一個(gè)對(duì)象,等值比較不應(yīng)該直接用等號(hào)。 另一個(gè)坑是
java的整數(shù)緩存。
查看jdk的源碼如下:
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property
int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low)); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} }即整數(shù)緩存緩存了前127個(gè)整數(shù),沒有重新生成。
當(dāng)然,還遇到其它各種各樣的坑。可怕的不是掉入坑中,而是掉入坑里了不正視問題也不查找問題所在,一而再再而三地掉進(jìn)坑里。
免費(fèi)領(lǐng)取驗(yàn)證碼、內(nèi)容安全、短信發(fā)送、直播點(diǎn)播體驗(yàn)包及云服務(wù)器等套餐
更多網(wǎng)易技術(shù)、產(chǎn)品、運(yùn)營經(jīng)驗(yàn)分享請(qǐng)?jiān)L問網(wǎng)易云社區(qū)。
文章來源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25358.html
摘要:篇樣式兼容性問題按模式渲染按模式渲染怪異模式怪異模式是沒有遵守規(guī)范的一種兼容模式,其中的是包括左右左右在內(nèi)的全部范圍也一樣,類似于,而且的不能從父元素繼承。 HTML 篇 樣式兼容性問題 怪異模式 怪異模式是沒有遵守 W3C 規(guī)范的一種兼容模式,其中的 width 是包括 contentWidth, 左右padding, 左右border 在內(nèi)的全部范圍(height 也一樣)...
摘要:篇樣式兼容性問題按模式渲染按模式渲染怪異模式怪異模式是沒有遵守規(guī)范的一種兼容模式,其中的是包括左右左右在內(nèi)的全部范圍也一樣,類似于,而且的不能從父元素繼承。 HTML 篇 樣式兼容性問題 怪異模式 怪異模式是沒有遵守 W3C 規(guī)范的一種兼容模式,其中的 width 是包括 contentWidth, 左右padding, 左右border 在內(nèi)的全部范圍(height 也一樣)...
摘要:篇樣式兼容性問題按模式渲染按模式渲染怪異模式怪異模式是沒有遵守規(guī)范的一種兼容模式,其中的是包括左右左右在內(nèi)的全部范圍也一樣,類似于,而且的不能從父元素繼承。 HTML 篇 樣式兼容性問題 怪異模式 怪異模式是沒有遵守 W3C 規(guī)范的一種兼容模式,其中的 width 是包括 contentWidth, 左右padding, 左右border 在內(nèi)的全部范圍(height 也一樣)...
摘要:我們要進(jìn)行一個(gè)奇數(shù)的篩選,所以我們這么寫然后我們改為版本這會(huì)導(dǎo)致我們的篩選功能失效,因?yàn)榈姆祷刂灯ヅ洳皇峭耆嗟鹊钠ヅ洌灰欠祷刂的苻D(zhuǎn)換為,就會(huì)被認(rèn)定為通過篩選。 這里指的遍歷方法包括:map、reduce、reduceRight、forEach、filter、some、every因?yàn)樽罱M(jìn)行了一些數(shù)據(jù)匯總,node版本已經(jīng)是8.11.1了,所以直接寫了個(gè)async/await的腳...
閱讀 2721·2023-04-26 02:28
閱讀 2551·2021-09-27 13:36
閱讀 3123·2021-09-03 10:29
閱讀 2751·2021-08-26 14:14
閱讀 2101·2019-08-30 15:56
閱讀 830·2019-08-29 13:46
閱讀 2609·2019-08-29 13:15
閱讀 454·2019-08-29 11:29