NaN, Infinity a Divide by Zero vo VB.NET
Knihy o programovaní pre začiatočníkov zvyčajne obsahujú toto varovanie: „Nedeľte nulou! Dostanete chybu pri spustení!'
Veci sa zmenili VB.NET . Aj keď je ich viac programovanie možnosti a výpočet je presnejší, nie je vždy ľahké pochopiť, prečo sa veci dejú tak, ako sa dejú.
Tu sa naučíme, ako zvládnuť delenie nulou pomocou štruktúrovaného spracovania chýb VB.NET. A popri tom sa venujeme aj novým konštantám VB.NET: NaN, Infinity a Epsilon.
Čo sa stane, ak spustíte „Divide by Zero“ vo VB.NET
Ak spustíte scenár „rozdelenie nulou“ vo VB.NET, dostanete tento výsledok:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Tak čo sa tu deje? Odpoveď je, že VB.NET vám v skutočnosti dáva matematicky správnu odpoveď. Matematicky ty môcť vydeľte nulou, ale dostanete „nekonečno“.
|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Hodnota 'nekonečno' nie je príliš užitočná pre väčšinu obchodných aplikácií. (Pokiaľ sa generálny riaditeľ nečuduje, aká je horná hranica jeho akciového bonusu.) Ale zabraňuje tomu, aby vaše aplikácie zlyhali na výnimke runtime, ako to robia menej výkonné jazyky.
VB.NET vám dáva ešte väčšiu flexibilitu tým, že vám dokonca umožňuje vykonávať výpočty. Pozri na toto:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Aby ste zostali matematicky správne, VB.NET vám dáva odpoveď NaN (nie je číslo) pre niektoré výpočty, ako napríklad 0 / 0.
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
VB.NET dokáže rozlíšiť aj medzi kladným a záporným nekonečnom:
|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Okrem PositiveInfinity a NegativeInfinity poskytuje VB.NET aj Epsilon, najmenšiu kladnú hodnotu Double väčšiu ako nula.
Majte na pamäti, že všetky tieto nové možnosti VB.NET sú dostupné len s dátovými typmi s pohyblivou rádovou čiarkou (Double alebo Single). A táto flexibilita môže viesť k určitému zmätku Try-Catch-Finally (štruktúrované spracovanie chýb). Napríklad kód .NET vyššie beží bez vyvolania akejkoľvek výnimky, takže jeho kódovanie v bloku Try-Catch-Finally nepomôže. Ak chcete otestovať delenie nulou, museli by ste kódovať test niečo ako:
|_+_||_+_|
Aj keď program nakódujete (použitím typu Integer namiesto typu Single alebo Double), stále získate výnimku „Pretečenie“, nie výnimku „Rozdelenie nulou“. Ak na webe hľadáte inú technickú pomoc, všimnete si, že všetky príklady testujú overflowException.
.NET má v skutočnosti výnimku DivideByZeroException ako legitímny typ. Ale ak kód nikdy nespustí výnimku, kedy niekedy uvidíte túto nepolapiteľnú chybu?
Keď uvidíte Výnimku DivideByZero
Ukázalo sa, že, Microsoft Stránka MSDN o blokoch Try-Catch-Finally v skutočnosti používa príklady delenia nulou na ilustráciu ich kódovania. Je tu však jemný „háčik“, ktorý nevysvetľujú. Ich kód vyzerá takto:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Tento kód robí spustiť skutočné delenie nulovou výnimkou.
Ale prečo tento kód spúšťa výnimku a nič, čo sme predtým zakódovali, nespustí? A čo Microsoft nevysvetľuje?
Všimnite si, že operácia, ktorú používajú, je nie delenie ('/'), je to celočíselné delenie ('')! (Iné príklady spoločnosti Microsoft skutočne deklarujú premenné ako celé číslo.) Ako sa ukázalo, výpočet celého čísla je iba prípad, ktorý v skutočnosti vyvoláva túto výnimku. Bolo by pekné, keby Microsoft (a ostatné stránky, ktoré kopírujú ich kód) vysvetlili tento malý detail.