4

次の質問を読みました: Value of i for (i == -i && i != 0) to return true in Javaで、少し目がくらんだままでした。

間違った単位系を使用したために宇宙船が失われたと読んだことがあるので、質問と awnser で言及されている動作を見るのは私にとってまったく予想外です。

実行時のペナルティなしで、これによって生成されるエラー/予期しない動作からどのように保護しますか? (比較で意味のあるコードを考えるのは難しいと思いますが、負の値を返して失敗するの=はかなり簡単だと思います)。absキャッチする例外はありますか? これについて警告するリンター?


予期しない動作:

abs()入力が最小の負の数である場合、javaは最小の負の数を返します。-x=x には、2 の補数の最小の負の数である 0 以外の解があります。

4

1 に答える 1

3

ベスト プラクティスは次のいずれかです。

  1. システムで適切な型を使用します。マシン int は数学的な整数ではないことに注意してください。プログラムでマシン整数の範囲外の数値を使用する必要がある場合は、マシン整数ではなく、大きな整数ライブラリを使用する必要があります。

  2. 防御的にプログラムします。操作によって値が範囲外になる可能性がある場合は、操作の実行後にこれを明示的に確認する必要があります (または、操作の前に、引数がエラーを引き起こすかどうかを確認することをお勧めします)。

もちろん、2. を行う場合でも、エラーが発生した場合にどうするかを決定する必要がありますが、1 の場合はそうしません。ただし、大きな整数を使用すると、ほとんどの言語でパフォーマンスが低下します。その実行時のペナルティが安全性チェックの実行によるペナルティよりも大きいか小さいかは、プログラミング言語とプログラムの詳細に依存する可能性があります。

最終的に、自分が書いたコードに責任を持つのはプログラマーの仕事です。言語はあなたに多くの助けを提供することしかできません。

于 2013-07-22T13:14:02.407 に答える