摘要:在以為變更已發生的時候,其實變更沒有發生。造成數據寫入失敗。免費領取驗證碼內容安全短信發送直播點播體驗包及云服務器等套餐更多網易技術產品運營經驗分享請訪問網易云社區。文章來源網易云社區
本文由作者張遠道授權網易云社區發布。
坦白講身為程序員,bug在所難免。有人講,bug越多,說明程序員越偉大。這句話有它一定的道理。
因為從某方面講,bug多了說明他的代碼量也多。
言歸正傳,這里我記錄了我曾經犯過的幾個錯誤。希望看到的同儕能夠見而避之。
常用的一個場景,遍歷一個集合,對符合某種條件的元素做修改。習慣性地會寫出如下代碼:
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); }
期待的結果是:
2
2
3
但實際輸出為:
1
2
3
這是很容易掉進去的陷阱。即通過foreach遍歷對集合元素進行修改。在以為變更已發生的時候,
其實變更沒有發生。造成數據寫入失敗。
因為
for(Integer temp:testInt){ if(temp==1) temp=temp*2; }
將被翻譯成
for(int i=0,length=testStr.size();i根據oracle的官方文檔,正式翻譯應該如下
for (Iteratori = testInt.iterator(); i.hasNext(); ) { float i0 = (Integer)i.next(); if(i0 == 1) i0 = i0*2; }即,foreach里頭的的 temp變量只是一個局部變量,而且還是集合中元素的一個副本,并不是元素本身。
想到之前還遇到的一個問題,代碼簡化如下:
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");即在判斷整數相等時,使用了封裝類(由數據庫映射過來,用封裝類防止反射異常)。實際的輸出結果如下:
integer1 == integer2
integer3 != integer4
明眼人很容易看出來,這里掉入了兩個坑.一個坑是用等號判斷相等,除非是為了比較同一個對象,等值比較不應該直接用等號。 另一個坑是
java的整數緩存。
查看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() {} }即整數緩存緩存了前127個整數,沒有重新生成。
當然,還遇到其它各種各樣的坑。可怕的不是掉入坑中,而是掉入坑里了不正視問題也不查找問題所在,一而再再而三地掉進坑里。
免費領取驗證碼、內容安全、短信發送、直播點播體驗包及云服務器等套餐
更多網易技術、產品、運營經驗分享請訪問網易云社區。
文章來源: 網易云社區
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/25358.html
摘要:我們要進行一個奇數的篩選,所以我們這么寫然后我們改為版本這會導致我們的篩選功能失效,因為的返回值匹配不是完全相等的匹配,只要是返回值能轉換為,就會被認定為通過篩選。 這里指的遍歷方法包括:map、reduce、reduceRight、forEach、filter、some、every因為最近要進行了一些數據匯總,node版本已經是8.11.1了,所以直接寫了個async/await的腳...
閱讀 2731·2023-04-26 02:28
閱讀 2566·2021-09-27 13:36
閱讀 3136·2021-09-03 10:29
閱讀 2768·2021-08-26 14:14
閱讀 2111·2019-08-30 15:56
閱讀 845·2019-08-29 13:46
閱讀 2617·2019-08-29 13:15
閱讀 462·2019-08-29 11:29