为什么java不能优雅地使用除零返回某个值而是必须抛出异常?
我得到ArrayIndexOutOfBoundsException:0
这是因为damageTaken实际上是一个存储许多不同“损害”的值数组。
在java中我正在尝试创建一个进度条。我们的例子:在赛车游戏中,通过将高度值设置为游戏结束前允许的最大伤害的百分比,可能会造成伤害。
在计划开始时damageTaken = 0;
(damageTaken / maximumDamage)
将给出介于0 - 1之间的数字。
然后我将其乘以进度条的高度,以创建适当高度的填充条。
程序崩溃了。我希望进度条高度为零!
答案 0 :(得分:13)
你没有除以零,你除以零。
完全允许将两半归零。答案是零。假设你没有苹果。你在Alice和Bob之间分割你的零苹果。爱丽丝和鲍勃现在都没有苹果。
但是,你不能除以零。假设你有两个苹果。现在,你想把这些苹果给零人。每个人得到多少苹果?答案是未定义的,因此除以零是不可能的。
答案 1 :(得分:6)
(damageTaken / maximumDamage)
只有当maximumDamage
为零时,才会给出除零异常。
如果damageTaken
为零,则没有问题。
答案 2 :(得分:3)
只需添加0的特殊情况;
private int getProgress()
if (damageTaken == 0) {
return 0;
} else {
return (damageTaken / maximumDamage) * progress.getHeight();
}
}
然而,(而且它很大)你得到除以0的原因是因为maximumDamage
为0,不 damageTaken
。所以,你真正想要的是:
private int getProgress()
if (maximumDamage== 0) {
return 0;
} else {
return (damageTaken / maximumDamage) * progress.getHeight();
}
}
答案 3 :(得分:0)
让我们停止谈论非法行为,好像穿制服的数学警察即将风暴在房间里。 ;)对于这背后的数学推理,this related question很有用。
可以公平地问,为什么在这一切之后,现代编程平台不能以某种标准方式处理我们的错误,而是回答这个问题:Java,像大多数其他平台一样,当出现除零时会抛出错误。通常,您可以:
请注意,作为良好实践,第二种方法仅适用于您不希望变量在正常系统操作下的情况下。
所以是的,你需要一个特殊的案例来处理这种情况。欢迎来到编程。 ;)
答案 4 :(得分:0)
从概念上讲,让4/0产生一些任意数字并不比试图将计数加倍200,000000产生计数-294967296更糟糕。然而,大多数处理器将忽略大多数类型的算术溢出,除非有人明确检查它,但不能忽略除以零的尝试,除非事先明确地检查操作数(如果它们无效则跳过操作)。鉴于许多处理器都有“溢出”标志,没有什么能阻止处理器指定尝试除零应该只是设置溢出标志(成功的除法操作应该清除它);在这种情况下想要触发异常的代码可以这样做。
我怀疑这种独特行为的原因源于计算的早期阶段;当剩余部分小于除数时,除法指令的硬件可以判断它是完整的。如果从未发生这种情况,则指令可能会停止,直到一般监控时钟电路(设计为在任何原因下发出指令停止执行时发出故障信号)关闭。在今天的标准下,用于检测问题并退出而不会使CPU停止的硬件本来是微不足道的,但是在计算机是用分立晶体管构建的时代,告诉程序员不要试图划分它们更便宜,而且几乎同样有效零,永远。