Algavates programmeerimisraamatutes on tavaliselt see hoiatus: "Ärge jagage nulliga! Te saate käitusvea! "
Asjad on muutunud VB.NET. Kuigi neid on rohkem programmeerimine valikuid ja arvutus on täpsem, pole alati lihtne aru saada, miks asjad juhtuvad nii, nagu nad toimivad.
Siit õpime, kuidas käsitleda nulliga jagamist, kasutades VB.NETi struktureeritud tõrkekäsitlust. Ja teel katame ka uusi VB.NET-i konstante: NaN, Infinity ja Epsilon.
Mis juhtub, kui VB.NET-is käitatakse jaotist „Jaga nulli”
Kui käivitate VB.NET-is stsenaariumi „jaga nulliga”, saate järgmise tulemuse:
Dim a, b, c kui kahekordne
a = 1: b = 0
c = a / b
Konsool. WriteLine (_
"Kas teil on matemaatikareeglid" _
& vbCrLf & _
"tunnistati kehtetuks?" _
& vbCrLf & _
"Nulliga jagamine " _
& vbCrLf & _
"peab olema võimalik!")
Mis siin siis toimub? Vastus on, et VB.NET annab teile tegelikult matemaatiliselt õige vastuse. Matemaatiliselt, sina saab jagage nulliga, kuid see, mida saate, on "lõpmatus".
Dim a, b, c kui kahekordne
a = 1: b = 0
c = a / b
Konsool. WriteLine (_
"Vastus on:" _
& c)
'Kuvarid:
'Vastus on: lõpmatus
Väärtus "lõpmatus" pole enamiku ärirakenduste jaoks liiga kasulik. (Kui tegevjuht ei taha teada, milline on tema aktsiaboonuse ülempiir.) Kuid see hoiab teie rakendused kokku kukkumast tööaja erandiga, nagu teevad vähem võimsad keeled.
VB.NET annab teile veelgi suurema paindlikkuse, lubades isegi arvutusi teha. Vaata seda:
Dim a, b, c kui kahekordne
a = 1: b = 0
c = a / b
c = c + 1
'Lõpmatus pluss 1 on
'ikka lõpmatuseni
Matemaatiliselt korrektseks jäämiseks annab VB.NET mõnede arvutuste, näiteks 0/0 korral vastuse NaN (mitte arv).
Dim a, b, c kui kahekordne
a = 0: b = 0
c = a / b
Konsool. WriteLine (_
"Vastus on:" _
& c)
'Kuvarid:
'Vastus on: NaN
VB.NET oskab öelda ka erinevust positiivse lõpmatuse ja negatiivse lõpmatuse vahel:
Dim a1, a2, b, c kui kahekordne
a1 = 1: a2 = -1: b = 0
Kui (a1 / b)> (a2 / b), siis _
Konsool. WriteLine (_
"Positiivne lõpmatus on" _
& vbCrLf & _
"suurem kui" _
& vbCrLf & _
"negatiivne lõpmatus.")
Lisaks PositiveInfinity ja NegativeInfinity pakub VB.NET ka Epsiloni, väikseimat positiivset topeltväärtust, mis on suurem kui null.
Pidage meeles, et kõik need VB.NET-i uued võimalused on saadaval ainult ujukoma (topelt või ühe) andmetüüpidega. Ja selline paindlikkus võib põhjustada mõningast segadust „proovida-püüda lõpuks” (struktureeritud tõrkekäsitlus). Näiteks töötab ülaltoodud .NET-kood ilma mingisuguseid erandeid tegemata, nii et selle kodeerimine plokis "Proovige-saak lõpuks" ei aita. Nulljaotuse kontrollimiseks peaksite testima midagi sellist:
Kui c. ToString = "Lõpmatus" Siis...
Isegi kui programmi kodeerite (ühe- või topeltüüpide asemel kasutades täisarvu), saate ikkagi erandi „Ülevool”, mitte erandi „Jaga nulliga”. Kui otsite veebist muud tehnilist abi, märkate, et kõik näited testivad OverflowException'i.
.NET-il on õigustatud tüübina DivideByZeroException. Kui aga kood kunagi erandit ei käivita, siis millal te seda tabamatut viga näete?
Kui näete jaotist DivideByZeroException
Nagu selgub, MicrosoftMSDN-i leht Try-Catch-Lõppplokkide kohta kasutab tegelikult nullimisnäiteid, et illustreerida, kuidas neid kodeerida. Kuid seal on peen "saak", mida nad ei seleta. Nende kood näeb välja selline:
Tuhm kui täisarv = 0
Dim b Kuna täisarv = 0
Dim c Nagu täisarv = 0
Proovige
a = b \ c
Saak erandina
Konsool. WriteLine ("Ilmnes käitusaja viga")
Lõpuks
Konsool. ReadLine ()
Lõpetage proovimine
See kood teeb vallandab tegeliku jaotuse nulliga erandina.
Kuid miks see kood käivitab erandi ja mitte midagi, mida me varem kodeerisime, ei tee? Ja mida Microsoft ei seleta?
Pange tähele, et nende kasutatav toiming on mitte jaga ("/"), see on täisarv jaota ("\")! (Teised Microsofti näited deklareerivad muutujad tegelikult täisarvuna.) Nagu selgub, on täisarvu arvutamine järgmine: ainult Juhtum, mis tegelikult selle erandi viskab. Oleks olnud tore, kui Microsoft (ja teised lehed, mis nende koodi kopeerivad) seda pisiasja selgitaksid.