„NaN“, „Infinity“ ir „Divide by Zero“ VB.NET

click fraud protection

Pradedančiose programavimo knygose paprastai yra šis įspėjimas: „Neskirstykite į nulį! Gausite vykdymo klaidą! “

Viskas pasikeitė VB.NET. Nors yra ir daugiau programavimas parinktis, o skaičiavimas yra tikslesnis, ne visada lengva suprasti, kodėl viskas vyksta taip, kaip pasitaiko.

Čia mes sužinosime, kaip valdyti padalijimą pagal nulį, naudojant VB.NET struktūrizuotą klaidų tvarkymą. Pakeliui mes taip pat aprėpiame naujas VB.NET konstantas: „NaN“, „Infinity“ ir „Epsilon“.

Kas nutiks, jei VB.NET vykdysite „Padalinti pagal nulį“

Jei VB.NET vykdote scenarijų „padalinti iš nulio“, gausite šį rezultatą:

 Dim a, b, c kaip dviguba

 a = 1: b = 0

 c = a / b

 Konsolė. „WriteLine“ (_

 „Turi matematikos taisykles“ _

 & vbCrLf & _

 "buvo panaikintas?" _

 & vbCrLf & _

 "Dalyba iš nulio " _

 & vbCrLf & _

 "turi būti įmanoma!") 

Taigi, kas čia vyksta? Atsakymas yra tas, kad VB.NET iš tikrųjų pateikia jums matematiškai teisingą atsakymą. Matematiškai jūs gali padalink iš nulio, bet tai, ką gauni, yra „begalybė“.

 Dim a, b, c kaip dviguba
instagram viewer

 a = 1: b = 0

 c = a / b

 Konsolė. „WriteLine“ (_

 "Atsakymas yra: " _

 ir c)

 'Ekranai:

 'Atsakymas yra: begalybė 

Vertė „begalybė“ nėra labai naudinga daugeliui verslo programų. (Nebent generalinis direktorius domina, kokia yra viršutinė jo akcijų premijos riba.) Bet tai apsaugo jūsų programas nuo avarijų dėl vykdymo laiko išimties, kaip tai daro ne tokios galingos kalbos.

VB.NET suteikia dar daugiau lankstumo, net leidžiant atlikti skaičiavimus. Pažiūrėk:

 Dim a, b, c kaip dviguba

 a = 1: b = 0

 c = a / b

 c = c + 1

 „Begalybė plius 1 yra

 'vis tiek begalybė 

Norėdami išlikti matematiškai teisingi, VB.NET pateikia atsakymą NaN (ne skaičius), kai kuriems skaičiavimams, tokiems kaip 0/0.

 Dim a, b, c kaip dviguba

 a = 0: b = 0

 c = a / b

 Konsolė. „WriteLine“ (_

 "Atsakymas yra: " _

 ir c)

 'Ekranai:

 Atsakymas: NaN 

VB.NET taip pat gali pasakyti skirtumą tarp teigiamos begalybės ir neigiamos begalybės:

 Dim a1, a2, b, c kaip dvigubi

 a1 = 1: a2 = -1: b = 0

 Jei (a1 / b)> (a2 / b), tada _

 Konsolė. „WriteLine“ (_

 „Teigiama begalybė yra“ _

 & vbCrLf & _

 "geresnis negu" _

 & vbCrLf & _

 "neigiama begalybė".) 

Be „PositiveInfinity“ ir „NegativeInfinity“, „VB.NET“ taip pat teikia „Epsilon“, mažiausią teigiamą dvigubą vertę, didesnę nei nulis.

Atminkite, kad visos šios naujos „VB.NET“ galimybės yra prieinamos tik naudojant slankiojo kablelio (dvigubo ar vieno) duomenų tipus. Dėl šio lankstumo gali kilti painiavos dėl bandymo sugauti pagaliau (struktūrizuoto klaidų tvarkymo). Pvz., Aukščiau esantis .NET kodas vykdomas netaikant jokių išimčių, todėl nepavyks jo užkoduoti bloke „Try-Catch-End“. Norėdami išbandyti padalijimą iš nulio, turėsite užkoduoti tokį testą kaip:

 Jei c. ToString = "Begalybė", tada... 

Net jei koduojate programą (naudodami sveikąjį skaičių, o ne pavienius ar dvigubus tipus), vis tiek gaunate išimtį „Perpildymas“, o ne „Padalinti pagal nulį“. Jei internete ieškosite kitos techninės pagalbos, pastebėsite, kad visi pavyzdžiai patikrina „OverflowException“.

.NET iš tikrųjų „DivideByZeroException“ yra teisėtas tipas. Bet jei kodas niekada nesuaktyvins išimties, kada matysite šią neįmanomą klaidą?

Kai pamatysite „DivideByZeroException“

Kaip paaiškėja, „Microsoft“MSDN puslapyje apie „Try-Catch-Final“ blokus iš tikrųjų naudojami padalijimo iš nulio pavyzdžiai, siekiant parodyti, kaip juos užkoduoti. Tačiau yra subtilus „pagavimas“, kurio jie nepaaiškina. Jų kodas atrodo taip:

 Sumažinti kaip sveikasis skaičius = 0

 Dim b Kaip sveikasis skaičius = 0

 Dim c Kaip sveikasis skaičius = 0


 Bandyti

 a = b \ c

 Sugaukite kaip išimtį

 Konsolė. „WriteLine“ („Įvyko vykdymo laiko klaida“)

 Pagaliau

 Konsolė. „ReadLine“ ()

 Pabandykite 

Šis kodas daro suaktyvina faktinę padalijimą pagal nulinę išimtį.

Bet kodėl šis kodas suaktyvina išimtį ir nieko, ką mes anksčiau užkodavome, nepadaroma? O ko nepaaiškina „Microsoft“?

Atkreipkite dėmesį, kad jų naudojama operacija yra ne padalinti („/“), tai sveikasis skaičius padalinti („\“)! (Kiti „Microsoft“ pavyzdžiai iš tikrųjų kintamuosius deklaruoja kaip sveikuosius skaičius.) Kaip paaiškėja, sveikasis skaičiavimas yra tik atvejis, kuris iš tikrųjų panaikina šią išimtį. Būtų buvę puiku, jei „Microsoft“ (ir kiti puslapiai, kopijuojantys jų kodą) paaiškintų tą smulkmeną.

instagram story viewer