ArithmeticException Java?

任何人都可以帮我找到执行的位置吗? 我似乎无法找到问题..

public void fieldChanged(Field f, int context){ //if the submit button is clicked try{ stopTime = System.currentTimeMillis(); timeTaken = stopTime - startTime; timeInSecs = ((timeTaken/1000)); speed = 45/timeInSecs; Dialog.alert("Speed of Delivery: " + speed + "mph"); } catch(ArithmeticException e){ Dialog.alert("error " + speed); e.printStackTrace(); } } 

startTime变量是一个全局变量..

编辑:timeinSecs = 0怎么样? 我似乎无法让我的调试器为BlackBerry JDE工作,所以有人必须帮助我:( timeTaken应该是从按下启动按钮到按下停止按钮的按钮的时间。

所有其他变量也是全局变量

例外有类型,这允许您查找类型并快速对问题进行分类。 从文档:

ArithmeticException :在发生exception算术条件时抛出。 例如,整数“除以零”会抛出此类的实例。

此外,大多数例外都是通过一条消息构建的,以帮助您进一步弄清楚发生了什么。

 try { int i = 0 / 0; } catch (ArithmeticException e) { e.printStackTrace(); } 

这打印:

 java.lang.ArithmeticException: / by zero at [filename:line number] 

但是这是怎么发生的?

与许多其他编程语言一样,Java区分整数除法和浮点除法。

JLS 15.17.2分部操作员/

二元/运算符执行除法,产生其操作数的商。 左手操作数是被除数,右手操作数是除数。 整数除法向0舍入。[…]如果整数除数中的除数值为0,则抛出ArithmeticException

如果您不熟悉整数除法,以下内容可能会让您感到惊讶:

  System.out.println(1/2); // prints "0" 

这里发生的是由于被除数和除数都是int ,所以操作是整数除法,其结果舍入为int 。 请记住, int只能包含整数(有限范围,大约40亿个数字)。

您可以通过使至少一个操作数成为浮点数来指定您需要浮点除法。

  System.out.println(1/2.0); // prints "0.5" System.out.println(1D/2); // prints "0.5" 

D是数字文字的特殊后缀,用于指定它是double精度值。 还有L long (64位整数)。

double值需要存储在double变量中。

  double v = 1D / 2; // v == 0.5 int i = 1D / 2; // DOESN'T COMPILE!!! Explicit cast needed! 

请注意,执行哪个分区与它最终会进入的类型无关。 它只取决于股息和除数的类型。

  double v = 1 / 2; // v == 0.0 (!!!) 

您还应注意, double也是有限精度数。

  System.out.println(.2D + .7D - .9D); // prints "-1.1102230246251565E-16" 

但是我的代码怎么样?

那么现在,让我们关注你的代码发生了什么:

  timeTaken = stopTime - startTime; timeInSecs = ((timeTaken/1000)); speed = 45/timeInSecs; 

发生的事情很可能是timeTaken声明为long 。 因此timeTaken/1000导致整数除法。 如果timeTaken < 1000 ,则除法的结果为0

此时, timeInSecsdouble还是float都没关系,因为已经执行了整数除法。 这意味着timeInSecs将为00.0 ,具体取决于其类型。

但是,从您得到的错误中,可以确定timeInSecs可能是整数类型。 否则, 45/timeInSecs将导致浮点除法,导致Infinity (一个特殊的double 45/timeInSecs值),而不是抛出ArithmeticException

那么我们如何解决这个问题呢?

我们可以通过声明变量来解决这个问题,如下所示:

 long timeTaken; double timeInSecs; double speed; 

然后按如下方式执行计算(请注意, 1000现在是一个double值)。

 timeTaken = stopTime - startTime; timeInSecs = timeTaken/1000D; speed = 45D/timeInSecs; // D is not necessary here, but it's good for clarity 

也可以看看

  • 为什么(360/24)/ 60 = 0 ...在Java中
  • 如何在Java中将数字舍入到n个小数位

可能就在这里: speed = 45/timeInSecs;

确保timeInSecs不为零。

使timeInSecsspeed浮动,并执行:

 timeInSecs = (timeTaken/1000.0); 

45/0时间达到零,你在零处除以

速度= 45 / timeInSecs;

timeInSecs为零。

这似乎是方法体的第6行中的零除。

你不能用零除,在每个除法部分都需要额外的error handling。

我认为startime计算可能有问题,它实际上等于停止时间。 其他的事情可能是差异实际上超出了整数的限制,可能使用了很长。