2013-11-27 1 views
-5

Я пытаюсь сделать основной цикл синхронизации, но я получаюПочему я получаю ошибку с нулем?

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

Поскольку вы деление на ноль. Больше ничего не может вызвать сообщение об ошибке. –

+0

-1 - вы должны включить соответствующий вопрос в вопрос. См. [Help] –

+1

Знаете ли вы, что ошибка на самом деле является 'ArithmeticException' и что'/by zero error' означает, что значение, по которому вы делите, равно '0'? Перейдите в строку 79 в файле 'Game.java' и узнайте, что происходит. – SimonT

ответ

2

Из Javadoc для System.nanoTime

Этот метод обеспечивает наносекундной точности, но не обязательно Наносекундное разрешение (то есть, как часто изменяется значение) - нет гарантии сделал кроме того, что разрешение по крайней мере так же хорошо, как у currentTimeMillis()

Таким образом, два последовательных вызовов, которые вы вносите в System.nanoTime(), вероятно, имеют те же возвращаемое значение - именно поэтому делением разницы между ними дает вам исключение.

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 

Вы не можете разделить на нулевое значение. Это вызовет арифметическое исключение. Вы должны избегать этого, проверяя, что значение «прошедшееNs» равно нулю или нет, или вам нужно просто обработать это исключение, используя блок try catch.

if(passedNs != 0L){ 
     this.fps = (float)(1000000000L/passedNs); 
} 

или

try{ 
    this.fps = (float)(1000000000L/passedNs); 
}catch(Exception e){ 
    //handle the exception 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^