Frage

Ich kann diesen Fehler nicht verstehen:

In diesem Aufruf zur Methode setVolume, Volumen = 2055786000 und Größe = 93552000. Volumen ist eine Ganzzahleigenschaft, und die Größe ist auch ganzzahlig, wie Sie sehen können.

Die Klasse ist eine Teilklasse einer DBML -Entitätsklasse, diese Volumeneigenschaft ist jedoch keine Spalte in der Datenbank, sondern existiert nur in der Teilklasse als "Geschäftsobjekteigenschaft".

Im Detail sehen zeigt an:

Daten> Element : Um eine indizierte Eigenschaft zu bewerten, muss die Eigenschaft qualifiziert werden und die Argumente müssen vom Benutzer ausdrücklich bereitgestellt werden.

alt text

Was kann das verursachen ...?

War es hilfreich?

Lösung

Der Maximalwert einer Ganzzahl (die signiert ist) ist 2147483647. Wenn dieser Wert überläuft, wird eine Ausnahme ausgelöst, um ein unerwartetes Verhalten Ihres Programms zu verhindern.

Wenn diese Ausnahme nicht geworfen würde, hätten Sie einen Wert von -2145629296 für dein Volume, was höchstwahrscheinlich nicht gesucht wird.

Lösung: Verwenden Sie eine Int64 für Ihr Volumen. Mit einem maximalen Wert von 9223372036854775807, Sie sind wahrscheinlich mehr auf der sicheren Seite.

Andere Tipps

int.MaxValue = 2147483647
2055786000 + 93552000 = 2149338000 > int.MaxValue

Sie können diese Nummer also nicht in eine Ganzzahl speichern. Du könntest benutzen INT64 Typ, der einen maximalen Wert von hat 9,223,372,036,854,775,807.

Der Einfachheit halber werde ich Bytes verwenden:

byte a=250;
byte b=8;
byte c=a+b;

Wenn a, b und c 'int' wären, würden Sie 258 erwarten, aber im Fall von 'Byte' wäre das erwartete Ergebnis 2 (258 & 0xff), aber in einer Windows -Anwendung erhalten Sie eine Ausnahme in a Konsole eine, die Sie vielleicht nicht (ich nicht, aber das kann von IDE abhängen, ich benutze SharpDevelop).

Manchmal ist dieses Verhalten jedoch gewünscht (z. B. kümmern Sie sich nur um die unteren 8 Bit des Ergebniss).

Sie könnten Folgendes tun:

byte a=250;
byte b=8;

byte c=(byte)((int)a + (int)b);

Auf diese Weise werden beide 'a' und 'b' in 'int' konvertiert, fügte dann zurück zu 'Byte' zurückgegeben.

Um auf der sicheren Seite zu sein, möchten Sie vielleicht auch versuchen:

...
byte c=(byte)(((int)a + (int)b) & 0xFF);

Oder wenn Sie dieses Verhalten wirklich wollen, ist die viel einfachere Art, die oben genannten zu tun:

unchecked
{
    byte a=250;
    byte b=8;
    byte c=a+b;
}

Oder deklarieren Sie zuerst Ihre Variablen und machen Sie dann die Mathematik im Abschnitt "Deaktiviert".

Wenn Sie die Überprüfung des Überlaufs erzwingen möchten, verwenden Sie stattdessen "Checked".

Hoffe das klärt die Dinge auf.

Nurchi

Ps

Vertrau mir, diese Ausnahme ist dein Freund :)

Der Ergebnis des Ergebnisses ist außerhalb des Bereichs, den ein ganzzahliger Datentyp enthalten kann.

Versuchen Sie es mit Int64

Maximaler Wert für int ist 2147483647, also 2055786000+93552000> 2147483647 und es verursachte Überlauf

2055786000 + 93552000 = 2149338000, was größer als 2^31 ist. Wenn Sie also signierte Ganzzahlen verwenden, die auf 4 Bytes codiert sind, passt das Ergebnis der Operation nicht und Sie erhalten eine Überlaufausnahme.

Die maximale Größe für ein INT beträgt 2147483647. Sie können ein weitaus größeres INT64/Long verwenden.

Dieser Fehler trat für mich auf, als ein Wert als -1#IND aufgrund einer Teilung um Null zurückgegeben wurde. Weitere Informationen zu Ausnahmen von IEEE-Floating-Punkten in C ++ hier auf so und von John Cook

Für denjenigen, der diese Antwort heruntergeschlagen hat (und nicht angab), warum diese Antwort für einige von Bedeutung sein kann INT32 (oder sogar int64). Der Fehler, den Sie erhalten, ist also gleich (arithmetischer Betrieb führt zu einem Überlauf), aber der Grund ist etwas unterschiedlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top