为什么我得到一个/零错误?

时间:2013-11-27 03:21:19

标签: java exception timing

我正在尝试制作一个基本的计时循环,但我一直在

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;
        }
}

2 个答案:

答案 0 :(得分:2)

来自System.nanoTime

的Javadoc
  

此方法提供纳秒精度,但不一定   纳秒分辨率(即,值的变化频率) - 否   除了分辨率至少与分辨率一样好之外,还要做出保证   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 
}
相关问题