ArithmeticException Java?

时间:2010-04-26 21:28:42

标签: 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应该是从按下开始按钮到按下停止按钮的按钮的时间毫秒...... / p>

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

8 个答案:

答案 0 :(得分:15)

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

  

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 Division Operator /

  

二进制/运算符执行除法,产生其操作数的商。左手操作数是被除数,右手操作数是除数。整数除法向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(64位整数)也有long

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值)而非投掷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

另见

答案 1 :(得分:1)

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

确保timeInSecs不为零。

答案 2 :(得分:1)

制作timeInSecsspeed花车,然后执行:

timeInSecs = (timeTaken/1000.0);

答案 3 :(得分:0)

45/0时间到达零,你在

处除以零

速度= 45 / timeInSecs;

答案 4 :(得分:0)

timeInSecs为零。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

你不能除以零,需要在每个除法部分进行额外的错误处理。

答案 7 :(得分:0)

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