首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArithmeticException Java?

ArithmeticException Java?
EN

Stack Overflow用户
提问于 2010-04-27 05:28:42
回答 8查看 56.2K关注 0票数 2

有没有人能帮我找到可执行文件的位置?我似乎找不到问题所在。

代码语言:javascript
复制
  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应该是从按下开始按钮到按下停止按钮的时间,单位为毫秒……

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-04-27 09:17:17

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

ArithmeticException:当发生异常算术条件时抛出。例如,一个整数“除以零”抛出这个类的一个实例。

此外,大多数异常都是用消息构造的,以帮助您进一步弄清楚发生了什么。

代码语言:javascript
复制
try {
    int i = 0 / 0;
} catch (ArithmeticException e) {
    e.printStackTrace();
}

这将打印:

代码语言:javascript
复制
java.lang.ArithmeticException: / by zero
    at [filename:line number]

但是这是怎么发生的?

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

JLS 15.17.2 Division Operator /

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

如果你不熟悉整数除法,下面的内容可能会让你大吃一惊:

代码语言:javascript
复制
    System.out.println(1/2); // prints "0"

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

您可以通过将至少一个操作数设为浮点数来指定需要进行浮点除法。

代码语言:javascript
复制
    System.out.println(1/2.0); // prints "0.5"
    System.out.println(1D/2); // prints "0.5"

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

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

代码语言:javascript
复制
    double v = 1D / 2; // v == 0.5
    int i = 1D / 2; // DOESN'T COMPILE!!! Explicit cast needed!

请注意,执行哪个划分与它最终将转到什么类型没有任何关系。它只取决于被除数和除数的类型。

代码语言:javascript
复制
    double v = 1 / 2; // v == 0.0 (!!!)

您还应该注意到,double也是一个有限精度的数字。

代码语言:javascript
复制
    System.out.println(.2D + .7D - .9D); // prints "-1.1102230246251565E-16"

但是我的代码呢?

所以现在,让我们关注一下你的代码中发生了什么:

代码语言:javascript
复制
  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值),而不是抛出ArithmeticException

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

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

代码语言:javascript
复制
long timeTaken;
double timeInSecs;
double speed;

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

代码语言:javascript
复制
timeTaken = stopTime - startTime;
timeInSecs = timeTaken/1000D;
speed = 45D/timeInSecs; // D is not necessary here, but it's good for clarity

另请参阅

票数 16
EN

Stack Overflow用户

发布于 2010-04-27 05:31:25

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

确保timeInSecs不是零。

票数 1
EN

Stack Overflow用户

发布于 2010-04-27 05:33:02

创建timeInSecsspeed浮点数,然后执行以下操作:

代码语言:javascript
复制
timeInSecs = (timeTaken/1000.0);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2717032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档