当前位置: 首页 > 面试题库 >

ArithmeticException Java?

房子昂
2023-03-14
问题内容

谁能帮我找到执行的地方?我似乎找不到问题。

  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:发生异常算术条件时抛出。例如,整数“除以零”将引发此类的实例

此外,大多数异常都带有一条消息来构造,以帮助您进一步了解发生了什么。

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

打印:

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

但是,这是怎么发生的呢?

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

[JLS

15.17.2分区运营商/](http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#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-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

此时,timeInSecsa
double或a都无关紧要float,因为已经执行了整数除法。这意味着timeInSecs将根据其类型为00.0

但是,从错误中您可以确定这timeInSecs很可能是整数类型。否则,45/timeInSecs将导致浮点除法而不是throw
导致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


 类似资料:

相关阅读

相关文章

相关问答