天天看點

談談DivideByZeroException異常!并非像表面那麼簡單!

看到這個标題大家可能又會說了,這個異常“地球人”都知道,你試圖除以0的時候就會産生這個異常,實在沒有讨論的必要啊!

實際上這個異常,還是有很多值得注意的地方的,下面用幾個例子來說明問題!

1,       int i = 5;

            int j = i/ 0;

            Console.WriteLine(j);

大家可能認為會引發DivideByZeroException異常,實際上并不會,C#的編譯器會檢測出這個問題來,直接産生編譯錯誤:被常數零除。你直接除以0,編譯器這一關就通不過的。

2,        int i = 5;

            int j = j / (i-5);

            Console.WriteLine(j);

這次編譯器已經 不能發現問題了,會産生DivideByZeroException異常。

3,下面我們換成浮點型的變量試試

            float i = 5f;

            float j = i/(i-5);

            Console.WriteLine(j);

這次可能和大家預料的不同,編譯器沒有報錯,運作的時候也沒有抛出異常,輸出結果是正無窮大。可見在除0的問題上浮點數和整數 的處理方式是不同的。

4,下面用0/0來實驗一下:

            int i = 5f;

            int j = 0/ (i-5);

            Console.WriteLine(j);

這次顯示的就不是無窮大了,而是非數字了,實際上對doule類型的變量的處理方式和float相似,但是注意對decimal類型的變量的處理方式和整數類型,并不和浮點數有一樣的處理方式。

說了這麼多無非是想引起大家的注意,在處理被0除這個問題上,不同類型的處理方式是有差別的。

有人可能認為自己永遠不會犯這樣的錯誤,但是我要說的是這個錯誤有時很隐性,很難察覺,在實際的程式編寫過程中很有可能不經意間出現這個問題,這是就有必要知道C#編譯器和CLR是如何處理這個問題的,這樣可以幫助你更快的找到出錯的原因。

轉載于:https://www.cnblogs.com/xuefeng1982/archive/2009/02/13/1389964.html

c#