6

我在 Windows 下运行 Java 1.7.0_17 和 Jboss 4.2.3GA 的类中有一点代码。代码这样做:

Date newNextDate = inBetween(currentDate, nextDate, start);
print("newNextDate=" + newNextDate);

中间进行了相当简单的比较:

private Date inBetween(Date start, Date end, Date test) {
    ...
    Date contains = t.contains(test) ? test : end;
    print("returning contains=" + contains);
    return contains;
}

确切的实现 contains 不相关恕我直言,因为最终导致 java.util.Date 被分配给 contains 变量。标准输出上的输出是:

16:44:56,153 INFO returning contains=Tue Apr 30 23:59:59 CEST 2013
16:44:56,153 INFO newNextDate=null

这就是谜团开始的地方: 1. 就在 return 语句之前, contains 变量有一个值 2. 返回之后收集变量为 null

这怎么可能?

  • 是的,我们已经检查过这个 inbetween 方法是否被调用,否则它不会打印输出。
  • 不,没有同名的实例变量。但即便如此,两者之间也没有发生任何事情。
  • 不,我们无法调试该过程,因为它只发生在我们的生产服务器上,并且在开发中不可重现。

最奇怪的是,它只出现在这里,没有出现在 1.000.000 行代码中。

4

1 回答 1

2

也许你已经超载了你的 inBetween 并被调用:

private Date inBetween(long start, Date end, Date test) {
     Date result = null;
     inBetween(new Date(start), end, test);
     return result;
}

或者类似的典型。一个catch ... return null

唯一的其他技术方法是让 AOP 拦截器执行错误的缓存(memoization?)左右。不太可能。

于 2013-06-05T15:27:16.883 回答