NaN, bezgalība un dalīšana ar nulli pakalpojumā VB.NET
Sākotnējās programmēšanas grāmatās parasti ir šāds brīdinājums: “Nedaliet ar nulli! Jūs saņemsit izpildlaika kļūdu!
Lietas ir mainījušās VB.NET . Lai gan ir vairāk programmēšana opcijas un aprēķins ir precīzāks, ne vienmēr ir viegli saprast, kāpēc lietas notiek tā, kā notiek.
Šeit mēs uzzinām, kā rīkoties ar dalīšanu ar nulli, izmantojot VB.NET strukturēto kļūdu apstrādi. Turklāt mēs aptveram arī jaunās VB.NET konstantes: NaN, Infinity un Epsilon.
Kas notiek, ja vietnē VB.NET izpildāt funkciju Dalīt ar nulli
Ja VB.NET izpildāt scenāriju 'dalīt ar nulli', jūs saņemsiet šādu rezultātu:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Kas tad te notiek? Atbilde ir tāda, ka VB.NET faktiski sniedz jums matemātiski pareizo atbildi. Matemātiski tu var dalīt ar nulli, bet tas, ko jūs saņemat, ir 'bezgalība'.
|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Vērtība “bezgalība” nav pārāk noderīga lielākajai daļai biznesa lietojumprogrammu. (Ja vien izpilddirektors nedomā, kāda ir viņa akciju bonusa augšējā robeža.) Taču tas neļauj jūsu lietojumprogrammām avarēt izpildlaika izņēmuma gadījumā, kā to dara mazāk jaudīgas valodas.
VB.NET sniedz jums vēl lielāku elastību, pat ļaujot veikt aprēķinus. Pārbaudiet šo:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Lai saglabātu matemātisku pareizību, VB.NET sniedz jums atbildi NaN (nav skaitlis) dažiem aprēķiniem, piemēram, 0/0.
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
VB.NET var arī noteikt atšķirību starp pozitīvo bezgalību un negatīvo bezgalību:
|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Papildus PositiveInfinity un NegativeInfinity, VB.NET nodrošina arī Epsilon, mazāko pozitīvo Double vērtību, kas ir lielāka par nulli.
Ņemiet vērā, ka visas šīs jaunās VB.NET iespējas ir pieejamas tikai ar peldošā komata (dubultā vai viena) datu tipiem. Un šī elastība var radīt zināmu Try-Catch-Finally (strukturētas kļūdu apstrādes) neskaidrības. Piemēram, iepriekš minētais .NET kods darbojas bez jebkāda veida izņēmuma, tāpēc tā kodēšana blokā Try-Catch-Finally nepalīdzēs. Lai pārbaudītu dalījumu ar nulli, jums ir jākodē tests, piemēram:
|_+_||_+_|
Pat ja kodējat programmu (izmantojot veselu skaitli, nevis vienu vai dubultu tipu), jūs joprojām saņemat izņēmumu 'Pārplūde', nevis izņēmumu 'Sadalīt ar nulli'. Ja meklējat tīmeklī citu tehnisko palīdzību, pamanīsit, ka visi piemēri pārbauda OverflowException.
.NET faktiski ir DivideByZeroException kā likumīgs veids. Bet, ja kods nekad neizraisa izņēmumu, kad jūs kādreiz redzēsit šo nenotveramo kļūdu?
Kad jūs redzēsit DivideByZeroException
Kā izrādās, Microsoft MSDN lapā par blokiem Try-Catch-Finally faktiski tiek izmantoti piemēri dalīšana ar nulli, lai ilustrētu, kā tos kodēt. Bet ir kāds smalks “nozvejas”, ko viņi nepaskaidro. Viņu kods izskatās šādi:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Šis kods dara aktivizē faktisko dalīšanu ar nulli, izņēmumu.
Bet kāpēc šis kods aktivizē izņēmumu, un nekas, ko esam kodējuši iepriekš, nedara? Un ko Microsoft nepaskaidro?
Ievērojiet, ka viņu izmantotā darbība ir nē dalījums ('/'), tas ir vesels skaitlis dalījums ('')! (Citos Microsoft piemēros mainīgie faktiski tiek deklarēti kā veseli skaitļi.) Kā izrādās, veselu skaitļu aprēķins ir tikai gadījums, kas faktiski rada šo izņēmumu. Būtu bijis jauki, ja Microsoft (un pārējās lapas, kas kopē savu kodu) paskaidrotu šo mazo detaļu.