使用 ArrayList<E> 时对象字段被覆盖 [调试帮助]
Object field getting overwritten when using ArrayList<E> [Debug Help]
我可能在这里遗漏了一些非常简单的东西,但基本上我有我希望存储在全局 arrayList
中的对象。但是,当我离开该函数并尝试访问同一个 arrayList
中的对象元素时,一个字段正在被覆盖,我不确定如何覆盖。
我已将问题确定到特定区域,并将显示相关代码。 date(timeSlot
\Calendar
)对象就是这个问题的指标
requestHandler(){
Pattern pattern = Pattern.compile("*irrelevant regex*");
Matcher matcher = pattern.matcher(element);
while(matcher.find()) {
int requestID = Integer.parseInt(matcher.group(1));
Calendar startDate = dateHandler(matcher.group(2));
Calendar endDate = dateHandler(matcher.group(3));
TimeSlot timeSlot = generateTimeSlot(startDate, endDate);
TransmissionRequest t_Request = transmissionHandler(matcher.group(4));
BookingRequest request = new BookingRequest(requestID, timeSlot, t_Request);
requestList.add(request);
// debug //
System.out.println(request);
}
}
出于调试目的,我在最底部添加了 print 语句,它给出了正确的输出。基本上打印出 timeSlot
作为每个 BookingRequest
的字符串。很明显,具有正确 timeSlot
值的 request
对象被添加到 requestList
.
OUTPUT(我省略了不相关的字段)
BookingRequest:1
Date= 11:00 Mar-25 to 12:00 Mar-26
BookingRequest:2
Date= 12:00 Mar-24 to 03:00 Mar-27
BookingRequest:3
Date= 01:00 Mar-26 to 09:00 Mar-26
BookingRequest:4
Date= 11:00 Mar-25 to 09:00 Mar-26
BookingRequest:5
Date= 11:00 Mar-26 to 09:00 Mar-27
但是,一旦我离开这个函数并尝试通过 ArrayList requestList
打印完全相同的输出,我就会得到以下结果。
输出
BookingRequest:1
Date= 11:00 Mar-26 to 09:00 Mar-27
BookingRequest:2
Date= 11:00 Mar-26 to 09:00 Mar-27
BookingRequest:3
Date= 11:00 Mar-26 to 09:00 Mar-27
BookingRequest:4
Date= 11:00 Mar-26 to 09:00 Mar-27
BookingRequest:5
Date= 11:00 Mar-26 to 09:00 Mar-27
似乎每个 timeSlot
对象都被处理的最后一个 timeSlot
对象覆盖。我没有对数组进行任何修改,并确保在调用 requestHandler()
后立即获得此输出。下面的代码。
for(String element : input){
// Extract requests
if(element.matches("^Request.*")){
requestHandler(element);
}
}
for(BookingRequest request : requestList){
System.out.println(request);
}
这里还有相关的 handler
和 generate
函数,如果您认为问题在于它们。两者都创建了 TimeSlot
和 Calendar
的新实例,所以我认为重新分配同一实例不会有问题。
public static Calendar dateHandler(String stringExtract){
Calendar date = new GregorianCalendar();
SimpleDateFormat format = new SimpleDateFormat("HH MMM dd", Locale.ENGLISH);
try {
date.setTime(format.parse(stringExtract));
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public static TimeSlot generateTimeSlot(Calendar start, Calendar end){
TimeSlot newTimeSlot = new TimeSlot(start, end);
return newTimeSlot;
}
我花了太长时间试图找出确切的问题所在。我有一种感觉,它也可能与 matcher.find()
的行为有关,但我真的已经筋疲力尽地尝试了一切,只是为了确定确切的问题是什么,更不用说修复它了。
如有任何帮助,我们将不胜感激!
也许您应该检查静态字段:即 BookingRequest.timeSlot
,或 TimeSlot
本身。
我可能在这里遗漏了一些非常简单的东西,但基本上我有我希望存储在全局 arrayList
中的对象。但是,当我离开该函数并尝试访问同一个 arrayList
中的对象元素时,一个字段正在被覆盖,我不确定如何覆盖。
我已将问题确定到特定区域,并将显示相关代码。 date(timeSlot
\Calendar
)对象就是这个问题的指标
requestHandler(){
Pattern pattern = Pattern.compile("*irrelevant regex*");
Matcher matcher = pattern.matcher(element);
while(matcher.find()) {
int requestID = Integer.parseInt(matcher.group(1));
Calendar startDate = dateHandler(matcher.group(2));
Calendar endDate = dateHandler(matcher.group(3));
TimeSlot timeSlot = generateTimeSlot(startDate, endDate);
TransmissionRequest t_Request = transmissionHandler(matcher.group(4));
BookingRequest request = new BookingRequest(requestID, timeSlot, t_Request);
requestList.add(request);
// debug //
System.out.println(request);
}
}
出于调试目的,我在最底部添加了 print 语句,它给出了正确的输出。基本上打印出 timeSlot
作为每个 BookingRequest
的字符串。很明显,具有正确 timeSlot
值的 request
对象被添加到 requestList
.
OUTPUT(我省略了不相关的字段)
BookingRequest:1
Date= 11:00 Mar-25 to 12:00 Mar-26
BookingRequest:2
Date= 12:00 Mar-24 to 03:00 Mar-27
BookingRequest:3
Date= 01:00 Mar-26 to 09:00 Mar-26
BookingRequest:4
Date= 11:00 Mar-25 to 09:00 Mar-26
BookingRequest:5
Date= 11:00 Mar-26 to 09:00 Mar-27
但是,一旦我离开这个函数并尝试通过 ArrayList requestList
打印完全相同的输出,我就会得到以下结果。
输出
BookingRequest:1
Date= 11:00 Mar-26 to 09:00 Mar-27
BookingRequest:2
Date= 11:00 Mar-26 to 09:00 Mar-27
BookingRequest:3
Date= 11:00 Mar-26 to 09:00 Mar-27
BookingRequest:4
Date= 11:00 Mar-26 to 09:00 Mar-27
BookingRequest:5
Date= 11:00 Mar-26 to 09:00 Mar-27
似乎每个 timeSlot
对象都被处理的最后一个 timeSlot
对象覆盖。我没有对数组进行任何修改,并确保在调用 requestHandler()
后立即获得此输出。下面的代码。
for(String element : input){
// Extract requests
if(element.matches("^Request.*")){
requestHandler(element);
}
}
for(BookingRequest request : requestList){
System.out.println(request);
}
这里还有相关的 handler
和 generate
函数,如果您认为问题在于它们。两者都创建了 TimeSlot
和 Calendar
的新实例,所以我认为重新分配同一实例不会有问题。
public static Calendar dateHandler(String stringExtract){
Calendar date = new GregorianCalendar();
SimpleDateFormat format = new SimpleDateFormat("HH MMM dd", Locale.ENGLISH);
try {
date.setTime(format.parse(stringExtract));
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public static TimeSlot generateTimeSlot(Calendar start, Calendar end){
TimeSlot newTimeSlot = new TimeSlot(start, end);
return newTimeSlot;
}
我花了太长时间试图找出确切的问题所在。我有一种感觉,它也可能与 matcher.find()
的行为有关,但我真的已经筋疲力尽地尝试了一切,只是为了确定确切的问题是什么,更不用说修复它了。
如有任何帮助,我们将不胜感激!
也许您应该检查静态字段:即 BookingRequest.timeSlot
,或 TimeSlot
本身。