Knjige o programiranju obično uključuju ovo upozorenje: "Ne dijeli se s nulom! Dobićete pogrešku tijekom izvođenja! "
Stvari su se promijenile VB.NET. Iako ih ima više programiranje mogućnosti i izračunavanje je preciznije, nije uvijek lako shvatiti zašto se stvari odvijaju onako kako rade.
Ovdje smo naučili kako upravljati podjelom po nuli koristeći strukturirano rukovanje pogreškama VB.NET-a. Uz put pokrivamo i nove VB.NET konstante: NaN, Infinity i Epsilon.
Što se događa ako u VB.NET-u pokrenete 'Divide By Zero'
Ako u VB.NET pokrenete scenarij „podijeli na nulu“, dobit ćete ovaj rezultat:
Dim a, b, c Kao dvostruko
a = 1: b = 0
c = a / b
Konzola. WriteLine (_
"Imajte pravila iz matematike" _
& vbCrLf & _
"je opozvan?" _
& vbCrLf & _
"Podjela po nuli" _
& vbCrLf & _
"mora biti moguće!")
Pa što se ovdje događa? Odgovor je da VB.NET zapravo daje matematički ispravan odgovor. Matematički, ti limenka podijelite s nulom, ali ono što dobivate je "beskonačnost".
Dim a, b, c Kao dvostruko
a = 1: b = 0
c = a / b
Konzola. WriteLine (_
"Odgovor je: " _
& c)
'Prikazuje:
'Odgovor je: beskonačnost
Vrijednost "beskonačnosti" nije previše korisna za većinu poslovnih aplikacija. (Osim ako se izvršni direktor ne pita koja je gornja granica njegovog dodatnog uloga.) Ali to sprečava da se vaše aplikacije ruše na izuzeću za vrijeme izvođenja kao što to čine manje moćni jezici.
VB.NET vam daje još veću fleksibilnost omogućavajući čak i izvršavanje izračuna. Pogledaj ovo:
Dim a, b, c Kao dvostruko
a = 1: b = 0
c = a / b
c = c + 1
'Beskonačnost plus 1 je
'još uvijek beskonačnost
Da biste ostali matematički ispravni, VB.NET vam daje odgovor NaN (Nije broj) za neke proračune, poput 0/0.
Dim a, b, c Kao dvostruko
a = 0: b = 0
c = a / b
Konzola. WriteLine (_
"Odgovor je: " _
& c)
'Prikazuje:
'Odgovor je: NaN
VB.NET također može reći razliku između pozitivne beskonačnosti i negativne beskonačnosti:
Dim a1, a2, b, c Kao dvostruki
a1 = 1: a2 = -1: b = 0
Ako je (a1 / b)> (a2 / b) tada _
Konzola. WriteLine (_
"Postivna beskonačnost je" _
& vbCrLf & _
"veći od" _
& vbCrLf & _
"negativna beskonačnost.")
Pored PositiveInfinity i NegativeInfinity, VB.NET nudi i Epsilon, najmanju pozitivnu Double vrijednost veću od nule.
Imajte na umu da su sve ove nove mogućnosti VB.NET dostupne samo s podacima podataka s pomičnim zarezom (Double ili Single). A ta fleksibilnost može dovesti do neke zbrke Try-Catch-End (strukturirano rukovanje pogreškama). Na primjer, .NET kod iznad radi bez bacanja bilo kakve iznimke, tako da ga kodiranje unutar bloka Try-Catch-End neće pomoći. Da biste provjerili udjel u nuli, morate testirati test poput:
Ako c. ToString = "Beskonačnost" Zatim...
Čak i ako program kodirate (koristeći Integer umjesto Single ili Double vrsta), i dalje ćete dobiti izuzetak "Overflow", a ne iznimku "Divide by Zero". Ako pretražujete web tehničku pomoć, primijetit ćete da svi primjeri testiraju OverflowException.
.NET zapravo DivideByZeroException ima legitiman tip. Ali ako kôd nikada ne pokrene izuzetak, kada ćete ikada vidjeti ovu neuhvatljivu grešku?
Kad ćete vidjeti DivideByZeroException
Kao što se ispostavilo, MicrosoftMSDN stranica o Try-Catch-End blokovima koristi primjere dijeljenja po nuli da bi ilustrirala kako ih kodirati. Ali postoji suptilan "ulov" koji oni ne objašnjavaju. Njihov kod izgleda ovako:
Dim a As Integer = 0
Dim b kao cjelobrojni = 0
Dim c kao cjelobrojni = 0
Probati
a = b \ c
Uhvatite izuzeće kao iznimku
Konzola. WriteLine ("došlo je do pogreške pri izvođenju")
Konačno
Konzola. ReadLine ()
Zaustavi pokušaj
Ovaj kod se pokrenuti stvarnu podjelu nula iznimke.
Ali zašto ovaj kôd pokreće iznimku i ništa što smo prije kodirali? A što Microsoft ne objašnjava?
Primijetite da je operacija koju oni koriste ne podijeli ("/"), to je cijeli broj podijeli ("\")! (Ostali Microsoftovi primjeri zapravo deklariraju varijable kao Integer.) Kako se ispostavilo, izračun cijelog broja je samo slučaj koji zapravo baca tu iznimku. Bilo bi lijepo kad bi Microsoft (i ostale stranice koje kopiraju kod) objasnio taj mali detalj.