算术异常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