我正在尝试制作一个基本的计时循环,但我一直在
java.lang.ArithmaticException / by zero error
at Timer.advanceTime(Timer.java:24)
at Game.run(Game.java:79)
at java.lang.Thread.run(Thread.java:722)
这是我的代码:
public class Timer {
private static final long NS_PER_SECOND = 1000000000L;
private static final long MAX_NS_PER_UPDATE = 1000000000L;
private static final int MAX_TICKS_PER_UPDATE = 100;
private float ticksPerSecond;
private long lastTime;
public int ticks;
public float a;
public float timeScale = 1.0F;
public float fps = 0.0F;
public float passedTime = 0.0F;
public Timer(float ticksPerSecond) {
this.ticksPerSecond = ticksPerSecond;
this.lastTime = System.nanoTime();
}
public void advanceTime() {
long now = System.nanoTime();
long passedNs = now - this.lastTime;
this.lastTime = now;
if (passedNs < 0L) passedNs = 0L;
if (passedNs > 1000000000L) passedNs = 1000000000L;
this.fps = (float)(1000000000L / passedNs);
this.passedTime += (float)passedNs * this.timeScale * this.ticksPerSecond / 1.0E+009F;
this.ticks = (int)this.passedTime;
if (this.ticks > 100) this.ticks = 100;
this.passedTime -= this.ticks;
this.a = this.passedTime;
}
}
答案 0 :(得分:2)
来自System.nanoTime
此方法提供纳秒精度,但不一定 纳秒分辨率(即,值的变化频率) - 否 除了分辨率至少与分辨率一样好之外,还要做出保证 currentTimeMillis()
的那个
因此,您对System.nanoTime()
进行的两次连续调用可能具有相同的返回值 - 这就是为什么除以它们之间的差异会为您提供异常。
答案 1 :(得分:0)
可能这就是
的原因 if (passedNs < 0L) passedNs = 0L; // if so passedNs becomes Zero
if (passedNs > 1000000000L) passedNs = 1000000000L;
this.fps = (float)(1000000000L / passedNs); // if passedNs is zero the error will occur
您不能将值除以零。它将抛出一个算术异常。您必须通过检查'passNs'值是否为零来避免这种情况,或者您必须使用try catch块来处理该异常。
if(passedNs != 0L){
this.fps = (float)(1000000000L / passedNs);
}
或
try{
this.fps = (float)(1000000000L / passedNs);
}catch(Exception e){
//handle the exception
}