当前位置:  开发笔记 > 编程语言 > 正文

ArithmeticException Java?

如何解决《ArithmeticExceptionJava?》经验,为你挑选了1个好方法。

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

  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应该是从按下启动按钮到按下停止按钮的按钮的毫秒时间...

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



1> polygenelubr..:

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

ArithmeticException:在发生异常算术条件时抛出.例如,整数"除以零"会抛出此类的实例.

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

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抛出a.

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

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

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

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

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

D是数字文字的特殊后缀,用于指定它是double-precision值.还有Llong(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.

此时,无论timeInSecs是a double还是a 都没关系float,因为已经执行了整数除法.这意味着timeInSecs它将是0或者0.0,取决于它的类型.

但是,从您得到的错误中,可以确定timeInSecs可能是整数类型.否则,45/timeInSecs将导致浮点除法导致Infinity(特殊double值)而不是抛出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个小数位

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有