【问题标题】:Object field getting overwritten when using ArrayList<E> [Debug Help]使用 ArrayList<E> [调试帮助] 时对象字段被覆盖
【发布时间】:2017-04-03 13:19:05
【问题描述】:

我可能在这里遗漏了一些非常简单的东西,但基本上我希望将对象存储在全局的arrayList 中。但是,当我离开该函数并尝试访问同一 arrayList 中的对象元素时,一个字段被覆盖,我不确定如何。

我已将问题确定为特定区域,并将显示相关代码。日期(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);
}

如果您认为问题出在它们上,这里还有相关的 handlergenerate 函数。两者都创建了TimeSlotCalendar 的新实例,所以我认为重新分配同一个实例没有问题。

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 pojo 吗?
  • 抱歉没能早点回复这些cmets,睡着了。

标签: java debugging arraylist java-calendar


【解决方案1】:

也许您应该检查静态字段:即BookingRequest.timeSlot,或TimeSlot 本身。

【讨论】:

  • 天啊。我不相信。我的BookingRequest 构造函数中有一个静态变量,我很确定我自己没有输入它,而是eclipse 有一个快速修复选项,它使它如此,我从未注意到它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2014-07-14
  • 2011-04-11
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多