Java中list集合的clean()方法濫用引發的bug


做的是電商系統,主系統生成訂單后,分別加入到不同的隊列中給另外的三個子系統來異步處理,訂單和商品是一對多的關系,在實際測試中,發現其中有一個子系統從隊列中獲取到的訂單實體中,商品列表一直為空,子系統的開發人員一直說是獲取不到值導致。因為這個問題,測試一直沒通過,不得已只能打日志,反復排查。最后發現在這個子系統中,從隊列拿到訂單實體后,商品列表是不為空的,但是在執行了一個方法后,該訂單實體類的商品就為空了。定位到問題后,調試這個方法,后來發現,整個方法的邏輯都是沒問題的,只是在方法的最后,對傳入的參數列表執行了clean()的操作。

     因為實際項目的業務場景比較復雜,在這里就設計一個簡單的例子來實際說明。定義一個City 的實體類和Country的實體類

public class City {

private Integer id;

private String name;

    //省略了setget方法

}

public class Country {

private Integer id;

private String name;

private List<City> listCity; //CountryCity是一對多的關系

    //省略了setget方法   

}

然后寫測試類運行:

public class Test {

public static void main(String[] args) {

City city1=new City();

city1.setId(1);

city1.setName("廣州");

City city2=new City();

 

city2.setId(2);

city2.setName("上海");

List<City> listCity=new ArrayList<>();

listCity.add(city1);

listCity.add(city2);

 

Country country=new Country();

country.setId(1);

country.setName("中國");

country.setListCity(listCity);

getCity(country.getListCity());

System.out.println("list size:"+country.getListCity().size());

 

}

public static void getCity(List<City> listCity){

listCity.clear();

}

}

運行該程序,運行結果是:list size:0

而如果把getCity方法中listCity.clear()注釋掉,則運行結果為:list size:2

這正是導致項目出現那個bug的原因,其實一般來說,除非已經確定沒有程序用到該集合,否則一般不會在方法的最后執行clear()操作。

知道這個原因后,現在來分析為什么調用這個方法后會導致這個后果。查看JDKclean()源碼:

 

 

通過讀源碼發現,當調用clean()后,會將集合中的數據全部移走,並且將集合中長度置為0。也就是說該方法調用后,集合會變為空。

 

 

微信掃一掃
關注java高高手


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM