計畫真的趕不上變化,時間過得真快。廢話不多說了,今天主要記錄之前有同事遇到的一些坑分享出來。
對於其他物件的應用,一般在使用之前會判斷它是否為空,如果不為空才會使用它以及它裡面的一些屬性值。但是對於基本型別的封裝型別,就有很多人漏掉對於它的判斷。
就在前面幾天有位同事(應屆生)問我說這段**它怎麼會報空指標呢? 先模擬下這個場景下的**:
//他給我看的**就是類似fun()方法中的**, 我一看這個**就感覺不對勁,我說你這個count類下的total屬性是int嗎?如果是int就可以這麼用。他說為什麼? 「如果是integer型別,那麼它的初始值不是0而是null, 而你上面的這些邏輯又不能保證total 一定會獲取到數值,那麼它就還有可能是null,你這樣使用的話就有可能包npe的問題。所以針對物件的使用提前判空更有保障。」 我接著說。 在我說的過程中他反應還是很快的,立馬檢視了這個實體類中total欄位的型別,於是就明白了。如果沒有養成提前使用判空的習慣(除非你能保證一定會有值),老手都容易會踩這樣的坑。比方說針對boolean型別的使用,有很多人會直接這樣的哦(這樣肯定會有問題的)。第三方的實體類物件
class
count
public
class
demotest
}@test
public
void
test()
}
boolean flag = null另外針對基本型別的封裝型別使用還有些要注意的請看這篇文章:;
//經過一系類操作處理
//進行判斷
if(flag)
現在有很多都是基於分布式服務,那應該會存在這個域對應資料需要同步到其他域下,然後這種同步必然會產生差異,需要一種自檢的job去檢測差異。打個比方有些商家自己有官網售賣自己的產品,也還有可能會在天貓開***售賣。假如它分配在天貓的商品資訊是通過它本地天貓資料庫同步過去的,那麼這種難免會產生差異,特別是庫存,如果一邊多一邊少就可能會導致超賣的情況。 所以這種情況需要有個job對比兩邊的差異,下面先簡單模擬下事發情況(注意下面的用法):
1看到上面**其實很簡單,輸出結果大家也都知道。下面先一步一步的分析,然後再介紹在大量資料的情況下這會產生結果。public
class
sublisttest
39 }
第二步:跳到第一次擷取之後,看list有什麼變化?
它的記憶體位址變了,也就說每次sublist都會產生乙個新物件,那麼得檢視下這sublist的原始碼,而原始碼中確實是會產生乙個新物件。但是請仔細sublist的建構函式,其中會存放它的父級物件。那麼這會產生什麼影響呢?請接著往下看。
public listsublist(int fromindex, int第三步:在第三次擷取之前直接在原始碼中sublist建構函式中打斷點,然後跳轉進來,看看對應物件的屬性值:toindex)
private
class sublist extends abstractlistimplements
randomaccess
//後面方法省略
}
咋一看,這裡面怎麼param_1怎麼來的?通過第二步檢視sublist的原始碼再加上第一步的需要你留意list原生的的物件記憶體位址,你就知道param_1對應是這個list的根物件,它一直保留子物件新增的物件。那麼大家想下,這種做法當遇到海量資料對比差異時會產生什麼影響呢?
如果剛才看懂了上面所說的,那麼肯定會明白這個list的根物件累積到後面肯定會變成大物件,這樣會導致平凡的fullgc而且你還**不掉。因為它一直在使用,直至這個程式執行結束。
踩坑案例 一分錢引發的系統設計「踩坑」案例
阿里巴巴的電商業務十分複雜,一方面是市場多樣化,業務多樣化,另外是消費者,商家的影響面非常廣,任何乙個小故障都可能引發一些社會問題,所以阿里對產品的質量,對服務的連續性有嚴格的要求。阿里技術人員在日常的研發運維過程中,積累了豐富的實戰經驗。今天,為大家分享乙個關於故障,排查,分析和改進的真實案例。他...
踩坑 常見的報錯
attributeerror module scipy.misc has no attribute imread 出現此錯誤的原因在於scipy與pillow沒有安裝或者版本不正確。如果使用的pycharm編寫 那麼可以直接在pycharm裡安裝scipy 如果之前已經安裝過,但是版本不對,那麼直接...
mysql 常見的坑 常見的Mysql踩坑區
為了看的明顯,我們先建立乙個表測試一下 create table student id int 11 not null,name varchar 20 default null,age int 11 default null,primary key id engine innodb default ...