A kezdő programozási könyvek általában tartalmazzák ezt a figyelmeztetést: "Ne ossza meg nullával! Futásidejű hibát fog kapni! "
A dolgok megváltoztak VB.NET. Bár vannak még programozás opciók és a számítás pontosabb, nem mindig könnyű belátni, hogy miért történnek a dolgok úgy, ahogy vannak.
Itt megtanuljuk, hogyan kell kezelni a nulla osztást a VB.NET strukturált hibakezelésével. Útközben az új VB.NET állandókra is kiterjedünk: NaN, Infinity és Epsilon.
Mi történik, ha a VB.NET 'Divide By Zero' parancsát futtatja
Ha a „nullával történő megosztás” forgatókönyvet futtatja a VB.NET-ben, akkor az alábbi eredményt kapja:
Dim a, b, c, mint dupla
a = 1: b = 0
c = a / b
Konzol. WriteLine (_
"Van matematikai szabályok" _
& vbCrLf & _
"hatályon kívül helyezték?" _
& vbCrLf & _
"Osztás nullával " _
& vbCrLf & _
"lehetségesnek kell lennie!")
Szóval mi folyik itt? A válasz az, hogy a VB.NET valóban megadja a matematikailag helyes választ. Matematikailag te tud osztja meg nullával, de amit kapsz, a "végtelenség".
Dim a, b, c, mint dupla
a = 1: b = 0
c = a / b
Konzol. WriteLine (_
"A válasz: " _
és c)
„Kijelzők:
'A válasz: végtelen
A "végtelen" érték nem túl hasznos a legtöbb üzleti alkalmazás számára. (Hacsak a vezérigazgató nem kíváncsi, hogy mekkora a részvénybónusz felső határa.) De ez megakadályozza, hogy alkalmazásai összeomlanak egy futási kivétel alapján, mint például a kevésbé hatékony nyelvek.
A VB.NET még nagyobb rugalmasságot biztosít azáltal, hogy lehetővé teszi számítások elvégzését. Ezt nézd meg:
Dim a, b, c, mint dupla
a = 1: b = 0
c = a / b
c = c + 1
„A végtelenség plusz 1 az
még mindig a végtelenség
Annak érdekében, hogy matematikailag helyes maradjon, a VB.NET megadja a NaN (nem egy szám) választ néhány számításhoz, például 0/0.
Dim a, b, c, mint dupla
a = 0: b = 0
c = a / b
Konzol. WriteLine (_
"A válasz: " _
és c)
„Kijelzők:
'A válasz: NaN
A VB.NET meg tudja mondani a különbséget a pozitív végtelenség és a negatív végtelenség között:
Dim a1, a2, b, c, mint dupla
a1 = 1: a2 = -1: b = 0
Ha (a1 / b)> (a2 / b) akkor _
Konzol. WriteLine (_
"A pozitív végtelenség" _
& vbCrLf & _
"nagyobb, mint" _
& vbCrLf & _
"negatív végtelenség.")
A PositiveInfinity és NegativeInfinity mellett a VB.NET az Epsilon-ot is biztosítja, amely a legkisebb nulla pozitív kettős érték.
Ne feledje, hogy a VB.NET ezen új képességei csak lebegőpontos (dupla vagy egységes) adattípusokkal érhetők el. És ez a rugalmasság némi Try-Catch-End (strukturált hibakezelés) zavart okozhat. Például a fenti .NET-kód bármilyen kivétel nélkül fut, ezért a kódolása a Try-Catch-végre blokkban nem segít. A nullával történő elválasztás teszteléséhez valami hasonlót kell kódolnia:
Ha c. ToString = "Infinity" Akkor...
Még akkor is, ha a programot kódolja (egész számot használ egyszeri vagy dupla típusok helyett), akkor is kap "Túlcsordulás" kivétel, nem pedig "Osztás nullával" kivétel. Ha más műszaki segítséget keres az interneten, észre fogja venni, hogy a példák mind tesztelik a OverflowException-t.
A .NET tulajdonképpen a DivideByZeroException legitim típusa. De ha a kód soha nem váltja ki a kivételt, akkor mikor fogja látni ezt a megfoghatatlan hibát?
Amikor megjelenik a DivideByZeroException
Ahogy kiderül, MicrosoftA Try-Catch-Végső blokkokról szóló MSDN-oldal valóban a nulla osztás példákat használja annak kódolására. De van egy finom "fogás", amelyet nem magyaráznak meg. Kódjuk így néz ki:
Halványítsa egész számként = 0
Dim b Mivel egész szám = 0
Dim c Mint egész szám = 0
Próbáld ki
a = b \ c
Catch exc Kivételként
Konzol. WriteLine ("Futási idő hiba történt")
Végül
Konzol. ReadLine ()
Vége a próbálkozásnak
Ez a kód csinál kiváltja a tényleges megosztást nulla kivétellel.
De miért ez a kód váltja ki a kivételt, és semmi, amit korábban kódoltunk, nem történik? És mit nem magyaráz a Microsoft?
Vegye figyelembe, hogy az általuk használt művelet megtörtént nem osztás ("/"), ez egész szám osztás ("\")! (Más Microsoft példák valójában egész számként deklarálják a változókat.) Mint kiderült, az egész számítás a csak az az eset, amely valóban ezt a kivételt vonja maga után. Jó lett volna, ha a Microsoft (és a többi kódot lemásoló oldal) elmagyarázná ezt a kis részletet.