为什么将零除以不可恢复的问题?

时间:2010-09-28 22:28:46

标签: java processing divide-by-zero

为什么java不能优雅地使用除零返回某个值而是必须抛出异常?

我得到ArrayIndexOutOfBoundsException:0这是因为damageTaken实际上是一个存储许多不同“损害”的值数组。

在java中我正在尝试创建一个进度条。我们的例子:在赛车游戏中,通过将高度值设置为游戏结束前允许的最大伤害的百分比,可能会造成伤害。

在计划开始时damageTaken = 0;

(damageTaken / maximumDamage)

将给出介于0 - 1之间的数字。

然后我将其乘以进度条的高度,以创建适当高度的填充条。

程序崩溃了。我希望进度条高度为零!

5 个答案:

答案 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停止的硬件本来是微不足道的,但是在计算机是用分立晶体管构建的时代,告诉程序员不要试图划分它们更便宜,而且几乎同样有效零,永远