Ошибка деления на ноль, как мне это исправить? - PullRequest
10 голосов
/ 02 октября 2008

C # новичок здесь, когда int 'max' ниже равно 0, я получаю ошибку деления на ноль, я могу понять, почему это происходит, но как мне справиться с этим, когда max равно 0? позиция также int.

    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
        {
        }
    }

Ответы [ 10 ]

16 голосов
/ 02 октября 2008
int percent = 0
if (max != 0) percent = (100*position) / max
9 голосов
/ 02 октября 2008

Ну, это полностью зависит от поведения, которое вы хотите. Если максимальное значение панели вашей программы равно нулю, заполнено ли оно? Это пусто? Это выбор дизайна, и когда вы выбрали, просто проверьте max == 0 и разверните ответ.

8 голосов
/ 02 октября 2008
  • Вы можете выбросить исключение.
  • Вы можете сделать int percent = ( max > 0 ) ? (100 * position) / max : 0;
  • Вы можете ничего не делать вместо присвоения значения процентам.
  • много, много другого ...

Зависит от того, что вы хотите.

3 голосов
/ 02 октября 2008

Проверка на ноль.

if ( max == 0 ) {
    txt = "0%";
} else {
    // Do the other stuff....
2 голосов
/ 02 октября 2008

Это не проблема C #, это математическая проблема. Деление на ноль не определено. Есть оператор if, который проверяет, является ли max> 0, и только тогда выполняет ваше деление.

1 голос
/ 02 октября 2008

Конвертируй

int percent = (100 * position) / max;

в

int percent;
if (max != 0)
    percent = (100 * position) / max;
else
    percent = 100; // or whatever fits your needs
0 голосов
/ 02 октября 2008

Если вы используете это для загрузки, вы, вероятно, захотите показать 0%, так как я предполагаю, что max == 0 в этом случае, когда вы еще не ЗНАЕТЕ размер файла.

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

Если вы используете это для какой-то другой длинной задачи, я бы предположил, что 100%

Но также, поскольку позиция никогда не может быть между 0 и -1, поэтому вы, вероятно, захотите сбросить 100 *

0 голосов
/ 02 октября 2008

Вам понадобится пункт охраны, который проверяет 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);
}

Вы также можете обработать исключение деления на ноль, как показал ваш пример, но, как правило, обходиться с исключениями обходится дороже, чем устанавливать проверки на известные неверные значения.

0 голосов
/ 02 октября 2008

Я предполагаю, что главный вопрос: имеет ли смысл даже вызывать эту функцию, где max равно '0'? Если да, то я бы добавил к нему специальную обработку, т.е.

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

Если 0 не имеет смысла, я бы выяснил, откуда он.

0 голосов
/ 02 октября 2008

Что ж, если max равно нулю, прогресс не будет достигнут. Попробуйте поймать исключение, где это называется. Это, вероятно, место, чтобы решить, есть ли проблема, или индикатор выполнения должен быть установлен в ноль или в 100%.

...