NaN, Infinity és Divide by Zero a VB.NET-ben

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".

instagram viewer
 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.