定義ArrayList為全部變數引發的錯誤

2021-10-08 05:17:36 字數 4418 閱讀 1473

@transactional

public apiresult sendcoupon(couponrequest couponrequest)

if(stringutils.isblank(couponrequest.getuserids()))

miniprogram miniprogram = miniprogramservice.querybytoken(couponrequest.getprogramtoken());

optional.ofnullable(miniprogram).orelsethrow(() -> new miniexception(errcode.program_not_exists));

optional.ofnullable(couponrequest.getid()).orelsethrow(()->new couponexception(errcode.primary_id_not_null));

coupon entity=couponservice.getcoupon(couponrequest.getid());

string str=couponrequest.getuserids().split(",");

usercoupon usercoupon=null;

usercoupondetail usercoupondetail=null;

usercouponitemrelation usercouponitemrelation=null;

usercouponshoprelation usercouponshoprelation=null;

listusercouponitemrelationlist=new arraylist<>();

listusercouponshoprelationlist=null;

for(int i=0;i//關聯會員優惠券表

usercoupon=new usercoupon();

usercoupon.setuserinfoid(long.parselong(str[i]));

usercoupon.setusestatus(boolean.false);//未使用

usercoupon.setcouponid(entity.getid());

usercoupon.setsouce(couponsouceenum.business_distribution.getname());//商家派發

usercoupon.setcreatetime(new date());

usercoupon.setupdatetime(new date());

//儲存獲取主鍵id

usercouponservice.insert(usercoupon);

//關聯會員優惠券明細表

usercoupondetail=new usercoupondetail();

usercoupondetail.setcouponid(entity.getid());

usercoupondetail.setusercouponsid(usercoupon.getid());

usercoupondetail.setcouponname(entity.getname());//優惠券名稱

usercoupondetail.setcoupontype(entity.getcoupontype());//優惠券型別

usercoupondetail.setdeduct(entity.getdeduct());//抵扣金額

usercoupondetail.setdiscount(entity.getdiscount());//折扣比率

usercoupondetail.setlowerconsumeramount(entity.getlowerconsumeramount());//最低消費

usercoupondetail.setuserange(entity.getuserange());//使用範圍

usercoupondetail.setvalidstartdate(entity.getvalidstartdate());//有效期開始時間

usercoupondetail.setvalidenddate(entity.getvalidenddate());//有效期結束時間

usercoupondetail.setremark(entity.getremark());

usercoupondetailservice.addusercoupondetail(usercoupondetail);

if(entity.getuserange().equals(userangeenum.part.getname()))

usercouponitemrelationservice.batchaddusercouponitemrelation(usercouponitemrelationlist);

}//關聯會員優惠券門店表

listcouponshoprelationlist=couponshoprelationservice.querybycouponid(entity.getid());

usercouponshoprelationlist=new arraylist<>();

for(couponshoprelation couponshoprelation:couponshoprelationlist)

usercouponshoprelationservice.batchaddusercouponshoprelation(usercouponshoprelationlist);

}entity.setremainamount(entity.getremainamount()-str.length);

couponservice.updatecoupon(entity);

apiresult.succ(entity);

return apiresult;

}

定義usercouponitemrelationlist為全域性變數的時候,使用for迴圈遍歷。第一次迴圈,usercouponitemrelationlist新增了五個元素,第二次迴圈新增了三個,第二次的時候,usercouponitemrelationlist元素為8

一共儲存了5+(5+3)=13條記錄

我預期是5+3=8

出現問題的根本原因就是usercouponitemrelationlist每次迴圈一直追加

解決方案:

在外部申明:

listusercouponitemrelationlist=null;
在每次迴圈的時候分配記憶體

listusercouponitemrelationlist=new arraylist<>();

或:使用arraylist.clear()  每次迴圈清空、

public void clear()

擴充套件:物件的宣告放在棧記憶體,在例項化物件的時候,會在堆記憶體開闢乙個記憶體,然後把這個記憶體的位址交給物件。這個就是物件的宣告和例項化過程

一)關於使用arraylist儲存全域性變數

**如下:

public static void main(string args)

for(int i=0;i<3;i++)

}輸出結果:

demo [id=0]

demolist.get(i):0

demo [id=1]

demolist.get(i):1

demo [id=2]

demolist.get(i):222

2問:為什麼在迴圈輸出時候提取list是相同?

個人總結:

(1)list裡面雖然有3個元素,但是元素的物件指向的位址都是同乙個記憶體位址。

(2)你只new一次,但是只為demo分配乙個位址,但是每次都是操作這個demo,第乙個迴圈。

(3)另外,因為list是允許元素重複的,所以,你同乙個物件可以加n次,另乙個集合set是不允許元素重複。

元素重複的意思是,記憶體位址一樣

(4)最後一次則新增id為2,則覆蓋之前的id,arraylist則儲存最後乙個物件的值。

二)使用arraylist儲存區域性變數

對於上邊的程式,把宣告放到for迴圈裡面時候,則是不同的指向位址。

public static void main(string args)

for(int i=0;i<3;i++)

}執行結果:

引數為空,選擇全部

在使用wyn enterprise 設計報表時,經常會用到查詢引數。使用者帶有引數的報表,在檢視時,未選擇引數值即可以顯示全部資料。選擇引數值後,則按照引數值過濾查詢。即引數為空,選擇全部。如下圖。實現此效果,需要在報表內嵌資料集中使用動態sql。sql寫法 select from demo 銷售明...

自定義實現ArrayList

package com.mylist public class myarraylist 返回list的大小 return public int size 判斷是否為空 return public boolean isempty 建立指定大小的list集合 param init public myar...

ArrayList實現自定義排序

arraylist中存在sort排序方法,只要你實現了comparator的介面,按照你自己的排序業務進行實現,你只要告訴這個介面按照什麼型別進行排序就ok了。這種方式類似於設計模式中的策略模式,把流程劃分好,具體的業務邏輯由使用者指定 實現 public class comparatortest ...