2008-10-01 9 views
9

C# novice ici, lorsque l'int « max » est 0 ci-dessous je reçois une division par zéro erreur, je ne vois pas pourquoi cela se produit mais comment dois-je gérer quand max est 0? la position est aussi un int.Diviser par zéro erreur, comment puis-je résoudre ce problème?

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

Vous pouvez utiliser une méthode de division en toute sécurité comme celui qui est disponible à l'adresse http: // stackoverflow.com/a/13260217/378115 –

Répondre

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

Vérifier zéro.

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

Eh bien, cela dépend entièrement du comportement que vous voulez. Si la valeur maximale de votre barre de programme est zéro, est-elle pleine? Est-ce vide? C'est un choix de conception, et quand vous avez choisi, faites un test pour max == 0 et déployez votre réponse.

8
  • Vous pouvez lever une exception.
  • Vous pouvez faire int percent = (max > 0) ? (100 * position)/max : 0;
  • Vous pouvez choisir de ne rien faire au lieu d'affecter une valeur au pourcentage.
  • beaucoup, beaucoup d'autres choses ...

Cela dépend de ce que vous voulez.

2

Ce n'est pas un problème C#, il est un problème de mathématiques. La division par zéro est indéfinie. Avoir une instruction if qui vérifie si max> 0 et seulement exécuter votre division alors.

0

Eh bien, si max est égal à zéro, alors il n'y a pas de progrès à faire. Essayez d'attraper l'exception où cela s'appelle. C'est probablement l'endroit pour décider s'il y a un problème ou si la barre de progression devrait être fixée à zéro ou à 100%.

+0

Je ne suis pas d'accord ici. Permettre que l'exception soit lancée s'accompagne d'un hit de performance - que se passe-t-il si le calcul se déroule dans une séquence de grandes boucles? Si nous pouvons anticiper le problème, nous devons y réagir AVANT que l'exception soit levée et laisser la gestion des exceptions à des scénarios inconnus. –

+0

@PatrickMcCurley Ce n'est pas un commentaire sur la gestion des exceptions arithmétiques génériques - c'est une réponse à la question posée. – Marcin

0

Je pense que la question fondamentale est: Est-il logique d'appeler cette fonction même où max est « 0 »? Si oui, alors j'ajouter un traitement spécial à ce i.e. .:

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

Si 0 n'a pas de sens, j'enquêter où il vient.

0

Vous avez besoin d'une clause de sauvegarde qui vérifie pour max == 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); 
} 

Vous pouvez également gérer la division par zéro exception, comme échantillon a montré, mais il est généralement plus coûteux à gérer les exceptions alors pour mettre en place des contrôles pour les mauvaises valeurs connues.

0

Si vous utilisez ce pour un téléchargement, vous aurez probablement envie de montrer 0% que je suppose que max serait == 0 dans ce cas quand vous ne connaissez pas encore la taille du fichier.

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

Si vous utilisez ce pour une autre tâche longue, je veux assumer 100%

Mais aussi, puisque la position ne peut jamais être compris entre 0 et -1, de sorte que vous aurez probablement envie de laisser tomber le 100 *

1

Convertissez votre

int percent = (100 * position)/max; 

dans

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