C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で0除算するとどうなる?無限大か例外か、正しい挙動と対処法を解説

C#において、0による除算(ゼロ除算)を行うと、System.DivideByZeroException という例外がスローされます。これは、割る数(除数)が0である場合に発生するエラーを処理するための専用クラスです。

実際に try-catch を使った例外処理のサンプルコードを見てみましょう。

コード例

using System;
namespace ErrorHandlingApplication {
    class DivNumbers {
        int result;

        DivNumbers() {
            result = 0;
        }

        public void division(int num1, int num2) {
            try {
                result = num1 / num2;
            } catch (DivideByZeroException e) {
                Console.WriteLine("Exception caught: {0}", e);
            } finally {
                Console.WriteLine("Result: {0}", result);
            }
        }

        static void Main(string[] args) {
            DivNumbers d = new DivNumbers();
            d.division(25, 0);
            Console.ReadKey();
        }
    }
}

実行結果

Exception caught: System.DivideByZeroException: Attempted to divide by zero.
at ErrorHandlingApplication.DivNumbers.division (System.Int32 num1, System.Int32 num2) [0x00000] in <a9b37148b4814c1a849bf4ee94fbe889> :0
Result: 0

このコードでは、次のように2つの値を使って除算を行っています。

result = num1 / num2;

ここで num2 に 0 を渡すと、通常であればプログラムがクラッシュしてしまいますが、try-catch ブロックで例外処理を実装しているため、DivideByZeroException が適切にキャッチされ、finally ブロックも実行された上で安全に処理が続行されます。

整数型と浮動小数点型で挙動が違う点に注意

タイトルにある「無限大か例外か」という疑問に対しては、データ型によって答えが変わるというのが正確です。

  • int 型などの整数型:0で割ると必ず System.DivideByZeroException が発生します。
  • double 型・float 型などの浮動小数点型:例外は発生せず、IEEE 754 規格に基づき「Infinity(無限大)」や「NaN(非数)」が返されます。

具体的には以下のような結果になります。

double d1 = 1.0 / 0.0; // 結果は PositiveInfinity(正の無限大)
double d2 = -1.0 / 0.0; // 結果は NegativeInfinity(負の無限大)
double d3 = 0.0 / 0.0; // 結果は NaN(非数)

まとめ

C#で0除算を扱う場合、整数型では DivideByZeroException の例外処理を必ず実装し、浮動小数点型では Infinity や NaN が返される可能性を考慮したチェックを行うことが、堅牢なプログラムを作成するためのポイントです。

  1. JavaScriptでスタックトレースを取得する方法【例外発生時のデバッグ術】

    JavaScriptの開発では、エラーの原因を特定するためにスタックトレース(呼び出し履歴)を確認することが非常に重要です。例外がスローされた箇所だけでなく、そこに至るまでの関数の呼び出し経路を把握できれば、バグの特定は格段に早くなります。 Errorオブジェクトのstackプロパティを使う JavaScriptでスタックトレースを取得する最もシンプルな方法は、new Error() でエラーオブジェクトを生成し、その stack プロパティを参照することです。コードにわずか数行追加するだけで、現在時点の呼び出し履歴を文字列として取得できます。 サンプルコード <html> &nb

  2. JavaScriptのInfinityプロパティとは?浮動小数点数の上限と下限を解説

    JavaScriptにおけるInfinityプロパティの概要 JavaScriptでは、浮動小数点数が表現できる最大値(Number.MAX_VALUE:約1.797693134862315 × 10308)を超えると、値は Infinity(正の無限大)として表示されます。逆に、表現できる最小の下限を超えて数値が小さくなりすぎた場合は -Infinity(負の無限大)として表示されます。 この仕組みは、JavaScriptがIEEE 754規格に基づく倍精度浮動小数点数を採用しているためです。計算結果が扱える範囲を外れると、エラーにはならず、自動的に無限大として処理される点が特徴的です。