Java System.currentTimeMillis() 在调试时表现出不同的行为;几乎就像两个狭缝实验
Java System.currentTimeMillis() exhibits different behavior when debugging; almost like two slit experiment
我的代码使用系统时间在绘制图像之前创建延迟。在主循环中重复调用 draw 方法。这是代码
private long delayToStartDraw = 1000;
private long callToStartDrawingInitialTime = 0;
public void draw(SpriteBatch batch) {
if (button != null && !shouldHide) {
boolean shouldDraw = System.currentTimeMillis() - delayToStartDraw > callToStartDrawingInitialTime;
if(shouldDraw){
button.draw(batch);
}
}
}
奇怪的是,如果我在 "boolean shouldDraw = ..." 上设置一个断点,它会 return 为真并每次绘制我的图像。但是,如果我在 "if(shouldDraw){" 行上放置一个断点,那么它每次都会 return 为 false。
有一个不一致,如果我观察我的布尔值的评估,它总是 return 为真。只有当我不看它在调试器中评估时(这将是正常情况)才会 return false。
我猜调用的结果可能被缓存了或者什么的,java 在评估上走捷径并假定它的初始值(false)因为它认为每次调用都应该相同,但是有人知道发生了什么事吗?
设置断点后,应用程序将在该行代码之前立即停止。
如果断点在第一行,那么 System.currentTimeMillis()
只会在您告诉程序在该行继续执行后才会被调用。如果这是在你的断点被击中后的几秒钟,它更有可能使你的条件为真,因为你实际预期的时间已经过去了。
这很有道理。如果您将断点放在行上:
boolean shouldDraw = System.currentTimeMillis() - delayToStartDraw > callToStartDrawingInitialTime;
调试器在执行该行之前 中断,特别是 在 发生 System.currentTimeMillis()
调用之前。所以可以说时钟是"still ticking"。当您进入下一行时,1000 毫秒已经过去,布尔值将为 true
.
另一方面,如果您在此行中断:
if(shouldDraw){
布尔值已设置(显然为 false
),调试器不再影响计时行为。
我的代码使用系统时间在绘制图像之前创建延迟。在主循环中重复调用 draw 方法。这是代码
private long delayToStartDraw = 1000;
private long callToStartDrawingInitialTime = 0;
public void draw(SpriteBatch batch) {
if (button != null && !shouldHide) {
boolean shouldDraw = System.currentTimeMillis() - delayToStartDraw > callToStartDrawingInitialTime;
if(shouldDraw){
button.draw(batch);
}
}
}
奇怪的是,如果我在 "boolean shouldDraw = ..." 上设置一个断点,它会 return 为真并每次绘制我的图像。但是,如果我在 "if(shouldDraw){" 行上放置一个断点,那么它每次都会 return 为 false。
有一个不一致,如果我观察我的布尔值的评估,它总是 return 为真。只有当我不看它在调试器中评估时(这将是正常情况)才会 return false。
我猜调用的结果可能被缓存了或者什么的,java 在评估上走捷径并假定它的初始值(false)因为它认为每次调用都应该相同,但是有人知道发生了什么事吗?
设置断点后,应用程序将在该行代码之前立即停止。
如果断点在第一行,那么 System.currentTimeMillis()
只会在您告诉程序在该行继续执行后才会被调用。如果这是在你的断点被击中后的几秒钟,它更有可能使你的条件为真,因为你实际预期的时间已经过去了。
这很有道理。如果您将断点放在行上:
boolean shouldDraw = System.currentTimeMillis() - delayToStartDraw > callToStartDrawingInitialTime;
调试器在执行该行之前 中断,特别是 在 发生 System.currentTimeMillis()
调用之前。所以可以说时钟是"still ticking"。当您进入下一行时,1000 毫秒已经过去,布尔值将为 true
.
另一方面,如果您在此行中断:
if(shouldDraw){
布尔值已设置(显然为 false
),调试器不再影响计时行为。