有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么被零除是一个不可恢复的问题?

为什么java不能优雅地返回一个除以零的值,而必须抛出一个异常

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

在java中,我试图创建一个进度条。我们的示例:在赛车游戏中,通过将高度值设置为gameover前允许的最大伤害百分比而造成的伤害

在节目开始时damageTaken = 0;

(damageTaken / maximumDamage)

将给出0-1之间的数字

然后我把它乘以进度条的高度,创建一个合适高度的填充条

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


共 (5) 个答案

  1. # 1 楼答案

    你不是在除零,你是在用某物除零

    完全允许取零的两半。答案是零。假设你没有苹果。你把你的零苹果分给了爱丽丝和鲍勃。爱丽丝和鲍勃现在都没有苹果了

    但是,你不能被零除。假设你有两个苹果。现在,你想把这些苹果给零个人。每个人得到多少个苹果?答案是未定义的,因此被零除是不可能的

  2. # 2 楼答案

    只需为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. # 3 楼答案

    从概念上讲,4/0产生一些任意数并不比尝试将2000000000的计数加倍产生-294967296的计数更糟糕。但是,大多数处理器将忽略大多数类型的算术溢出,除非显式检查它,但不能忽略被零除的尝试,除非事先显式检查操作数(如果操作数无效,则跳过该操作)。考虑到许多处理器都有“溢出”标志,没有什么可以阻止处理器指定尝试的除零操作只需设置溢出标志(成功的除法操作应清除溢出标志);在这种情况下,希望触发异常的代码可以这样做

    我怀疑这种不同行为的原因源于早期的计算;当余数小于除数时,除法指令的硬件可以判断它已完成。如果这种情况从未发生,指令可能会暂停,直到通用监控时钟电路(设计用于在指令因任何原因停止执行时发出故障信号)关闭为止。按照今天的标准,检测问题并退出而不使CPU停止运行的硬件本来是微不足道的,但在用分立晶体管构建计算机的时代,告诉程序员不要试图用零除,这是更便宜的,而且几乎同样有效的

  4. # 4 楼答案

    让我们停止谈论非法性,就好像穿制服的数学警察要冲进房间一样对于这背后的数学推理,this related question是有用的

    问一下为什么现代编程平台没有以某种标准的方式为我们处理零除错误是公平的,但要回答这个问题:Java和大多数其他平台一样,在发生零除错误时抛出错误。通常,您可以:

    • 之前处理:在进行除法之前,检查要用作零分母的变量
    • handleafter:您可以捕获发生零除时抛出的异常,并优雅地处理它

    请注意,作为良好实践,第二种方法仅适用于在正常系统操作下不希望变量为零的情况

    所以是的,你需要一个特殊的案例来处理这种情况。欢迎收看节目

  5. # 5 楼答案

    (damageTaken / maximumDamage)
    

    只有当maximumDamage为零时,才会出现除零异常

    如果damageTaken为零,则没有问题