做的是電商系統,主系統生成訂單后,分別加入到不同的隊列中給另外的三個子系統來異步處理,訂單和商品是一對多的關系,在實際測試中,發現其中有一個子系統從隊列中獲取到的訂單實體中,商品列表一直為空,子系統的開發人員一直說是獲取不到值導致。因為這個問題,測試一直沒通過,不得已只能打日志,反復排查。最后發現在這個子系統中,從隊列拿到訂單實體后,商品列表是不為空的,但是在執行了一個方法后,該訂單實體類的商品就為空了。定位到問題后,調試這個方法,后來發現,整個方法的邏輯都是沒問題的,只是在方法的最后,對傳入的參數列表執行了clean()的操作。
因為實際項目的業務場景比較復雜,在這里就設計一個簡單的例子來實際說明。定義一個City 的實體類和Country的實體類
public class City {
private Integer id;
private String name;
//省略了set和get方法
}
public class Country {
private Integer id;
private String name;
private List<City> listCity; //Country和City是一對多的關系
//省略了set和get方法
}
然后寫測試類運行:
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高高手