不可能的Java方法调用行为

不可能的Java方法调用行为,java,Java,我在一个类中有一点代码,该类在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

我在一个类中有一点代码,该类在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与IMHO无关,因为最终会将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

这到底是怎么可能的

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

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

可能是您的中间层超载了,因此会被调用:

private Date inBetween(long start, Date end, Date test) {
     Date result = null;
     inBetween(new Date(start), end, test);
     return result;
}
或者类似的典型。一个
捕获。。。返回空值


唯一的另一种技术方法是让AOP拦截器执行错误的缓存(内存化?)等等。不太可能。

在代码中的“打印”位置,打印堆栈跟踪<代码>异常e=新的NullPointerException();系统跟踪(e)(警告:伪java)并确保在
inBetween()
方法周围没有注入某种代理。(模糊但可能)您可以实际连接到jvm并远程调试生产服务器。使用调试并逐步迭代。必要时添加断点并查看值。您肯定在某个地方出错。或者您正在审阅的代码不是用于生成production中部署的代码的修订版。您可以在生产服务器上启用某种形式的日志记录吗?该方法是私有的,并且在同一个类中,因此不能重载。但我们检查过了,只有一个。在debug中,您可以跟踪对该方法的调用(但随后它就可以正常工作了)。不可能的代码,当确实没有最终块时,就没有其他
print(“returning contains=“+…”);返回null
中。(override=通过继承拥有具有相同名称和参数类型的方法;override=拥有具有相同名称但不同参数类型的方法)