2

Javaがゼロ除算の値を正常に返すことができず、代わりに例外をスローする必要があるのはなぜですか?

これは、 damageTakenArrayIndexOutOfBoundsException:0 が実際には多くの異なる「損傷」を格納する値の配列であるためです。

Javaでは、プログレスバーを作成しようとしています。私たちの例:レーシングゲームで、ゲームオーバー前に許可された最大ダメージのパーセンテージとして高さの値を設定することによって発生したダメージ。

プログラム開始時damageTaken = 0;

(damageTaken / maximumDamage)

0-1の間の数字を与えます。

次に、これにプログレスバーの高さを掛けて、適切な高さのフィルバーを作成します。

プログラムがクラッシュします。プログレスバーの高さをゼロにしたいです。

4

5 に答える 5

14

あなたはゼロで除算しているのではなく、ゼロを何かで除算しているのです。

ゼロの半分を取ることは完全に許可されています。答えはゼロです。リンゴがゼロだとしましょう。あなたはゼロのリンゴをアリスとボブの間で分割します。アリスとボブは両方ともリンゴがゼロになりました。

ただし、ゼロで除算することはできません。リンゴが2つあるとします。今、あなたはこれらのリンゴをゼロの人々に与えたいと思います。一人一人が何個のリンゴを手に入れますか?答えは未定義であるため、ゼロによる除算は不可能です。

于 2010-09-28T22:38:48.390 に答える
6
(damageTaken / maximumDamage)

これにより、がゼロの場合にのみ、ゼロ除算の例外が発生しmaximumDamageます。

がゼロの場合damageTaken、問題はありません。

于 2010-09-28T22:34:24.033 に答える
4

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();
    }
}
于 2010-09-28T22:34:59.597 に答える
1

概念的には、4/0で任意の数を生成することは、2000000000のカウントを2倍にして-294967296のカウントを生成することよりも悪くはありません。ただし、ほとんどのプロセッサは、明示的にチェックしない限り、ほとんどの種類の算術オーバーフローを無視しますが、事前にオペランドを明示的にチェックしない限り、ゼロ除算の試みを無視することはできません(無効な場合は操作をスキップします)。多くのプロセッサに「オーバーフロー」フラグがあることを考えると、ゼロ除算の試行がオーバーフローフラグを設定する以外に何もしないことをプロセッサが指定することを妨げるものは何もありません(除算操作が成功すると、オーバーフローフラグがクリアされます)。このような場合に例外をトリガーしたいコードはそうすることができます。

明確な振る舞いの理由は、コンピューティングの初期の頃に起因しているのではないかと思います。除算命令のハードウェアは、余りが除数よりも少ないときに完了したと判断できます。それが起こらなかった場合、一般的な監視クロック回路(何らかの理由で命令の実行が停止した場合に障害を通知するように設計されています)がシャットダウンするまで、命令が停止する可能性があります。問題を検出してCPUを停止せずに終了するハードウェアは、今日の標準では簡単でしたが、コンピューターがディスクリートトランジスタで構築されていた時代には、プログラマーにゼロ除算を試みないように指示する方が安価で、ほぼ同じくらい効果的でした。これまで

于 2014-01-21T23:55:38.973 に答える
0

まるで制服を着た数学の警察が部屋を襲撃しようとしているかのように、違法性について話すのをやめましょう。;)この背後にある数学的推論には、この関連する質問が役立ちます。

なぜ、現代のプログラミングプラットフォームがゼロ除算エラー標準的な方法で処理しないのかを尋ねるのは公正ですが、質問に答えるには、他のほとんどのプラットフォームと同様に、Javaは次の場合にエラーをスローします。ゼロによる除算が発生します。一般に、次のいずれかを実行できます。

  • 前に処理:除算を行う前に、ゼロの分母として使用される変数を確認してください
  • 後処理:ゼロ除算が発生したときにスローされた例外をキャッチし、適切に処理できます。

良い習慣として、2番目の方法は、通常のシステム操作で変数がゼロになるとは思わない場合にのみ適切であることに注意してください。

そうです、この状況を処理するには特別なケースが必要です。プログラミングへようこそ。;)

于 2010-09-28T22:45:54.383 に答える