2008-10-01 8 views
9

C# Anfänger hier, wenn der Int 'max' unter 0 ist Ich bekomme eine Division durch Null Fehler, ich kann sehen, warum dies passiert, aber wie soll ich damit umgehen, wenn max 0 ist? Position ist auch ein Int. Division durch Null Fehler, wie kann ich das beheben?

private void SetProgressBar(string text, int position, int max) 
    { 
     try 
     { 
      int percent = (100 * position)/max; //when max is 0 bug hits 
      string txt = text + String.Format(". {0}%", percent); 
      SetStatus(txt); 
     } 
     catch 
     { 
     } 
    } 
+0

Sie können eine sichere Unterteilungsmethode wie die unter http: // stackoverflow verfügbare verwenden.com/a/13260217/378115 –

Antwort

16
int percent = 0 
if (max != 0) percent = (100*position)/max 
3

prüfen Null.

if (max == 0) { 
    txt = "0%"; 
} else { 
    // Do the other stuff.... 
9

Nun, das hängt ganz von dem Verhalten ab, das Sie wollen. Wenn der Höchstwert Ihrer Programmleiste Null ist, ist sie voll? Ist es leer? Dies ist eine Design-Option, und wenn Sie gewählt haben, nur für max == 0 testen und Ihre Antwort bereitstellen.

8
  • Sie können eine Ausnahme auslösen.
  • Sie können int percent = (max > 0) ? (100 * position)/max : 0;
  • Sie können wählen, nichts zu tun, anstatt einen Wert zu Prozent zuweisen.
  • viele, viele andere Dinge ...

Hängt davon ab, was Sie wollen.

2

Dies ist kein C# -Problem, es ist ein mathematisches Problem. Division durch Null ist undefiniert. Habe eine if-Anweisung, die prüft, ob max> 0 ist und führe deine Division dann nur noch aus.

0

Nun, wenn max Null ist, dann ist kein Fortschritt zu machen. Versuchen Sie, die Ausnahme abzufangen, wenn diese aufgerufen wird. Das ist wahrscheinlich der Ort, um zu entscheiden, ob es ein Problem gibt oder ob der Fortschrittsbalken auf Null oder auf 100% gesetzt werden sollte.

+0

Ich muss hier nicht zustimmen. Wenn die Ausnahme ausgelöst wird, kommt es zu einem Leistungseinbruch - was passiert, wenn die Berechnung in einer großen Schleifensequenz abläuft? Wenn wir das Problem antizipieren können, sollten wir darauf reagieren, BEVOR die Ausnahme ausgelöst wird, und die Ausnahmebehandlung auf unbekannte Szenarien beschränken. –

+0

@PatrickMcCurley Dies ist kein Kommentar zur generischen arithmetischen Ausnahmebehandlung - es ist eine Antwort auf die eigentliche Frage. – Marcin

0

Ich denke, die Grundfrage lautet: Macht es Sinn, diese Funktion auch nur aufzurufen, wenn max '0' ist? Wenn ja, dann würde ich eine besondere Behandlung, um es hinzuzufügen d.h .:

if (max == 0) 
{ 
    //do special handling here 
} 
else 
{ 
    //do normal code here 
} 

Wenn 0 nicht sinnvoll ist, würde ich untersuchen, wo es herkommt.

0

Sie würden eine Schutzklausel müssen die für max == prüft 0.

private void SetProgressBar(string text, int position, int max) 
{ 
    if(max == 0) 
     return; 
    int percent = (100 * position)/max; //when max is 0 bug hits 
    string txt = text + String.Format(". {0}%", percent); 
    SetStatus(txt); 
} 

Sie auch die Division durch Null Ausnahme behandeln könnte, wie Ihre Probe zeigte, aber es ist in der Regel teurer Ausnahmen behandeln dann Einrichten von Überprüfungen für bekannte schlechte Werte.

0

Wenn Sie dies für einen Download verwenden, möchten Sie wahrscheinlich 0% anzeigen, da ich in diesem Fall maximal annehmen würde == 0, wenn Sie die Dateigröße noch nicht kennen.

int percent = 0; 
if (max != 0) 
    ...; 

Wenn Sie dies für einige andere lange Aufgabe verwenden, würde ich möchte 100%

anzunehmen, aber auch kann, da Position nie zwischen 0 und -1, so dass Sie wahrscheinlich werden wollen fallen die 100 *

1

Konvertieren Sie Ihre

int percent = (100 * position)/max; 

in

int percent; 
if (max != 0) 
    percent = (100 * position)/max; 
else 
    percent = 100; // or whatever fits your needs 
Verwandte Themen