任何人都可以帮我找到执行的地方吗?我似乎无法找到问题..
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>
所有其他变量也是全局变量
答案 0 :(得分:15)
例外有类型,这允许您查找类型并快速对问题进行分类。来自文档:
ArithmeticException
: 发生异常算术条件时抛出。例如,整数“除以零”会抛出此类的实例。
此外,大多数例外情况都会构建一条消息,以帮助您进一步弄清楚发生了什么。
try {
int i = 0 / 0;
} catch (ArithmeticException e) {
e.printStackTrace();
}
打印:
java.lang.ArithmeticException: / by zero
at [filename:line number]
但是这是怎么发生的?
与许多其他编程语言一样,Java区分整数除法和浮点除法。二进制
/
运算符执行除法,产生其操作数的商。左手操作数是被除数,右手操作数是除数。整数除法向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
。
此时,timeInSecs
是double
还是float
并不重要,因为已经执行了整数除法。这意味着timeInSecs
可以是0
或0.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)
制作timeInSecs
和speed
花车,然后执行:
timeInSecs = (timeTaken/1000.0);
答案 3 :(得分:0)
45/0时间到达零,你在
处除以零速度= 45 / timeInSecs;
答案 4 :(得分:0)
timeInSecs
为零。
答案 5 :(得分:0)
似乎这是方法体的第6行中的零除。
答案 6 :(得分:0)
你不能除以零,需要在每个除法部分进行额外的错误处理。
答案 7 :(得分:0)
我认为startime计算可能有问题,它实际上等于停止时间。其他的可能是差异实际上超出了整数的限制,可能使用了很长的。