算术异常Java?

算术异常Java?,java,Java,有人能帮我找到执行器在哪里吗?我似乎找不到问题 public void fieldChanged(Field f, int context){ //if the submit button is clicked try{ stopTime = System.currentTimeMillis(); timeTaken = stopTime - startTime; timeInSecs = ((timeTaken/1000));

有人能帮我找到执行器在哪里吗?我似乎找不到问题

  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变量是一个全局变量

编辑: TimeInsenses=0怎么可能?我似乎无法让我的调试器为BlackBerry JDE工作,因此必须有人来帮助我:(所用的时间应该是从按下开始按钮到按下停止按钮的时间,单位为毫秒。)


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

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


确保TimeInsenses不为零。

45/0所用的时间达到零,并且在


速度=45/timeinseces;

timeinseces
为零。

似乎这是在方法主体的第6行除以零。

使
timeinseces
速度
浮动,并执行以下操作:

timeInSecs = (timeTaken/1000.0);

您不能用零进行除法,需要对每个除法部分进行额外的错误处理。

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

: 发生异常算术条件时引发。例如,整数“除以零”引发此类的实例

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

try {
    int i = 0 / 0;
} catch (ArithmeticException e) {
    e.printStackTrace();
}
这张照片是:

java.lang.ArithmeticException: / by zero
    at [filename:line number]
但这是怎么发生的?

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

二进制
/
运算符执行除法,产生其操作数的商。左手操作数是被除数,右手操作数是除数。整数除法向0舍入。[…]如果整数除法中的除数值为0,则引发
算术异常

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

    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
是数字文字的特殊后缀,用于指定它是一个
双精度值。还有
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;
更可能发生的情况是
timetake
被声明为
long
。因此
timetake/1000
会导致整数除法。如果
timetake<1000
,则除法的结果为
0

此时,无论
timeinsenses
double
还是
float
,都没有关系,因为已经执行了整数除法。这意味着
timeinsenses
将是
0
0.0
,取决于其类型

但是,从您得到的错误中,可以确定
timeinsenses
很可能是整数类型。否则,
45/timeinsenses
将导致浮点除法,从而导致
无穷大(一个特殊的
值),而不是引发
算术异常

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

我们可以通过如下方式声明变量来解决此问题:

long timeTaken;
double timeInSecs;
double speed;
然后执行如下计算(请注意,
1000
现在是一个
double
值)

另见

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

您得到了什么异常?其他变量(stoptime、TimeTake、TimeInsenses)在哪里定义?
timeTaken = stopTime - startTime;
timeInSecs = timeTaken/1000D;
speed = 45D/timeInSecs; // D is not necessary here, but it's good for clarity