Java 为什么我会得到a/by零错误?

Java 为什么我会得到a/by零错误?,java,exception,timing,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_SECON

我试着做一个基本的计时循环,但我一直在做

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;
        }
}
公共类计时器{
专用静态最终长纳秒=100000000升;
每更新一次的专用静态最终长最大长度=1000000000L;
私有静态最终整数最大刻度每更新=100;
私人浮点数秒;
私人长时间;
公共卫生;
公开募股;
公共浮动时间刻度=1.0F;
公共浮动fps=0.0F;
公共浮点数通过时间=0.0F;
公共计时器(浮点滴答秒){
this.ticksPerSecond=ticksPerSecond;
this.lastTime=System.nanoTime();
}
public void advanceTime(){
long now=System.nanoTime();
long passedNs=now-this.lastTime;
this.lastTime=现在;
如果(通过数<0L)通过数=0L;
如果(通过数>100000000升)通过数=100000000升;
this.fps=(浮动)(1000000000L/passedNs);
this.passedTime+=(float)passedNs*this.timeScale*this.ticksPerSecond/1.0E+009F;
this.ticks=(int)this.passedTime;
如果(this.ticks>100)this.ticks=100;
this.passedTime-=this.ticks;
this.a=this.passedTime;
}
}

来自
系统的Javadoc.nanoTime

该方法提供纳秒精度,但不一定 纳秒分辨率(即值变化的频率)-否 作出保证,但决议至少与 currentTimeMillis()


因此,您对
System.nanoTime()
进行的两个连续调用可能具有相同的返回值-这就是为什么除以它们之间的差异会产生异常。

可能这就是原因

            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 


因为你要除以零。没有任何其他原因会导致错误消息。-1-您应该在问题中包含相关代码。请看,您是否知道错误实际上是
算术异常
,并且
/by zero error
表示您要除以的值是
0
?转到您的
Game.java
文件的第79行,了解发生了什么。@DavidWallace您可以将其作为答案发布。但现在你要让我把他的密码移到问题中去。@Robert谢谢。都做完了。
if(passedNs != 0L){
      this.fps = (float)(1000000000L / passedNs);
}
try{
    this.fps = (float)(1000000000L / passedNs);
}catch(Exception e){
    //handle the exception 
}