NaN, Infinity und Divide by Zero in VB.NET

click fraud protection

Zu Beginn beginnen Programmierbücher normalerweise die Warnung: "Teilen Sie nicht durch Null! Sie erhalten einen Laufzeitfehler! "

Die Dinge haben sich geändert VB.NET. Obwohl es mehr gibt Programmierung Optionen und die Berechnung ist genauer, es ist nicht immer leicht zu erkennen, warum die Dinge so passieren, wie sie es tun.

Hier erfahren Sie, wie Sie mit der Division durch Null mithilfe der strukturierten Fehlerbehandlung von VB.NET umgehen. Unterwegs behandeln wir auch die neuen VB.NET-Konstanten: NaN, Infinity und Epsilon.

Was passiert, wenn Sie in VB.NET 'Divide By Zero' ausführen?

Wenn Sie in VB.NET ein Szenario "Durch Null teilen" ausführen, erhalten Sie folgendes Ergebnis:

 Dim a, b, c As Double

 a = 1: b = 0

 c = a / b

 Konsole. WriteLine (_

 "Haben Sie mathematische Regeln" _

 & vbCrLf & _

 "aufgehoben worden?" _

 & vbCrLf & _

 "Durch Null teilen " _

 & vbCrLf & _

 "muss möglich sein!") 

Also, was ist hier los? Die Antwort ist, dass VB.NET Ihnen tatsächlich die mathematisch korrekte Antwort gibt. Mathematisch Sie können durch Null teilen, aber was Sie erhalten, ist "Unendlichkeit".

instagram viewer
 Dim a, b, c As Double

 a = 1: b = 0

 c = a / b

 Konsole. WriteLine (_

 "Die Antwort ist: " _

 & c)

 'Anzeigen:

 Die Antwort lautet: Unendlichkeit 

Der Wert "unendlich" ist für die meisten Geschäftsanwendungen nicht allzu nützlich. (Es sei denn, der CEO fragt sich, wie hoch die Obergrenze für seinen Aktienbonus ist.) Es verhindert jedoch, dass Ihre Anwendungen bei einer Laufzeitausnahme abstürzen, wie dies bei weniger leistungsfähigen Sprachen der Fall ist.

VB.NET bietet Ihnen noch mehr Flexibilität, indem Sie sogar Berechnungen durchführen können. Überprüfen Sie dies heraus:

 Dim a, b, c As Double

 a = 1: b = 0

 c = a / b

 c = c + 1

 'Unendlichkeit plus 1 ist

 'noch unendlich 

Um mathematisch korrekt zu bleiben, gibt Ihnen VB.NET die Antwort NaN (Not a Number) für einige Berechnungen wie 0/0.

 Dim a, b, c As Double

 a = 0: b = 0

 c = a / b

 Konsole. WriteLine (_

 "Die Antwort ist: " _

 & c)

 'Anzeigen:

 Die Antwort lautet: NaN 

VB.NET kann auch den Unterschied zwischen positiver und negativer Unendlichkeit erkennen:

 Dim a1, a2, b, c As Double

 a1 = 1: a2 = -1: b = 0

 Wenn (a1 / b)> (a2 / b), dann _

 Konsole. WriteLine (_

 "Postive Unendlichkeit ist" _

 & vbCrLf & _

 "größer als" _

 & vbCrLf & _

 "negative Unendlichkeit.") 

Neben PositiveInfinity und NegativeInfinity bietet VB.NET auch Epsilon, den kleinsten positiven Double-Wert größer als Null.

Beachten Sie, dass all diese neuen Funktionen von VB.NET nur mit Gleitkomma-Datentypen (Double oder Single) verfügbar sind. Und diese Flexibilität kann zu Verwirrung bei Try-Catch-finally (strukturierte Fehlerbehandlung) führen. Beispielsweise wird der obige .NET-Code ohne Ausnahme ausgeführt, sodass das Codieren in einem Try-Catch-finally-Block nicht hilft. Um eine Division durch Null zu testen, müssten Sie einen Test wie folgt codieren:

 Wenn c. ToString = "Unendlichkeit" Dann... 

Selbst wenn Sie das Programm codieren (mit Integer anstelle von Single- oder Double-Typen), erhalten Sie immer noch eine "Overflow" -Ausnahme, keine "Divide by Zero" -Ausnahme. Wenn Sie im Internet nach anderer technischer Hilfe suchen, werden Sie feststellen, dass alle Beispiele auf OverflowException testen.

.NET hat tatsächlich die DivideByZeroException als legitimen Typ. Aber wenn der Code niemals die Ausnahme auslöst, wann werden Sie diesen schwer fassbaren Fehler jemals sehen?

Wenn Sie DivideByZeroException sehen

Wie sich herausstellt, MicrosoftAuf der MSDN-Seite zu Try-Catch-finally-Blöcken werden Beispiele zum Teilen durch Null verwendet, um zu veranschaulichen, wie sie codiert werden. Aber es gibt einen subtilen "Haken", den sie nicht erklären. Ihr Code sieht folgendermaßen aus:

 Dim a As Integer = 0

 Dim b As Integer = 0

 Dim c As Integer = 0


 Versuchen

 a = b \ c

 Catch exc als Ausnahme

 Konsole. WriteLine ("Ein Laufzeitfehler ist aufgetreten")

 Schließlich

 Konsole. Zeile lesen()

 Versuch beenden 

Dieser Code tut eine tatsächliche Division durch Null-Ausnahme auslösen.

Aber warum löst dieser Code die Ausnahme aus und nichts, was wir zuvor codiert haben, tut dies? Und was erklärt Microsoft nicht?

Beachten Sie, dass die Operation, die sie verwenden, ist nicht dividieren ("/"), es ist eine ganzzahlige Division ("\")! (Andere Microsoft-Beispiele deklarieren die Variablen tatsächlich als Ganzzahl.) Wie sich herausstellt, ist die Ganzzahlberechnung die nur Fall, der tatsächlich diese Ausnahme auslöst. Es wäre schön gewesen, wenn Microsoft (und die anderen Seiten, die ihren Code kopieren) dieses kleine Detail erklärt hätten.

instagram story viewer