2017-04-03 45 views
0

可能有一些非常简单的东西,我在这里丢失了,但基本上我有我想要存储在全局的arrayList中的对象。但是,当我离开函数,并尝试访问这个相同的对象元素时,一个字段被覆盖,我不知道如何。当使用ArrayList时,对象字段被覆盖<E> [调试帮助]

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

对于调试目的,我添加打印语句在最底层,这给了我正确的输出。基本上打印出timeSlot作为每个BookingRequest的字符串。所以很明显request对象与正确的timeSlot值正被添加到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()的行为有关,但我已经完全用尽了所有努力来确定什么是确切的问题,更别说修复它了。

任何帮助将不胜感激!

+0

非常感谢您的意见。 –

+0

你能分享你的BookingRequest pojo吗? – Alekhya

+0

对不起,我不能早些回复这些评论,睡着了。 –

回答

1

也许您应该检查静态字段:即BookingRequest.timeSlotTimeSlot本身。

+0

omg。我不相信。我在我的'BookingRequest'构造函数中有一个静态变量,并且我很确定我没有在自己中输入它,但是eclipse有一个快速修复选项,使它如此,我从来没有注意到它。非常感谢! –