Обработка нулевого исключения C # - PullRequest
6 голосов
/ 29 октября 2010

Хорошо, новый кодер здесь ищет немного понимания этой проблемы. Итак, у меня есть цикл for, который начинается так:

for (int i = 0; i < rowHandles.Length; i++)
{
      .........code....
}

rowHandles - это массив int, который содержит строки данных. В цикле for есть код, который удаляет строки данных при нажатии кнопки удаления, а точнее, это кнопка удаления полосы сетки, которая находится внутри обработчика события нажатия кнопки удаления. Проблема в том, что кнопка удаления может быть нажата, когда не осталось строк, поэтому rowHandles.Length равно нулю. Как бы я помешал этому остановить программу? Есть ли что-то, что я мог бы добавить внутри цикла for, в объявлении цикла for или вне цикла for, чтобы исправить это? Может быть, попытка поймать? Как это будет строиться вокруг этой конкретной проблемы / цикла?

Спасибо за вашу помощь - Newbie Coder

Ответы [ 8 ]

10 голосов
/ 29 октября 2010

Если проблема в том, что rowHandles может быть null, просто добавьте явную проверку для того, что мешает вам выполнить оператор for.

if ( rowHandles != null ) { 
  for ( int i = 0; i < rowHandles.Length; i++ ) {
    ...
  }
}

Другой вариант - отключитькнопка удаления вообще, если нет строк для удаления.Операция недопустима, поэтому предотвратите ее с самого начала.

6 голосов
/ 30 октября 2010

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

3 голосов
/ 29 октября 2010

Проблема в том, что кнопка удаления может быть нажата, когда не осталось строк, поэтому rowHandles.Length равно нулю.

Это неправильно. Когда имеется 0 элементов, Length устанавливается в 0. Вероятно, null - это rowHandles. Вы должны справиться с этим условием, прежде чем попасть в свой цикл.

2 голосов
/ 29 октября 2010

Если строк не осталось, rowHandles.Length будет нулевым, а не нулевым.Если вы избавляетесь от rowHandles после цикла, то вы можете просто сделать:

if (rowHandles != null)
{
    for (int i = 0; i < rowHandles.Length; i++)
    {
          // Code
    }
}

Нет необходимости в обработке исключений.С другой стороны, если вы разрешаете изменять rowHandles чем-то другим во время выполнения этого цикла, это уже другая история.

2 голосов
/ 29 октября 2010

Это , а не rowHandles.Length, что является нулем, это rowHandles.
Распространенным решением будет:

if (rowHandles != null)  
//Your loop here
1 голос
/ 29 октября 2010

Я бы посоветовал вам как можно больше придерживаться Принципа единой ответственности , поскольку вы позволяете коду делать то, для чего он предназначен, и обрабатывать ошибки в других местах.

Для меня имеет смысл, что rowHandles используется в другом месте, поэтому вам следует централизовать процесс проверки, является ли он null.

Если вы по-прежнему решаете обрабатывать его в теле кода, на который ссылаетесь, любое из предложенных решений будет работать.

1 голос
/ 29 октября 2010

Похоже, длина не является тонким, который является нулевым.Скорее, это rowHandles, который имеет значение null, и вы получаете пустое исключение при попытке доступа к свойству Length.

if(rowHandles != null)
{
    //for loop
}
0 голосов
/ 29 октября 2010

Изменить на foreach цикл:

foreach (var rowHandle in rowHandles) 
{ 
    // use rowHandle instead of rowHandles[i]
} 

Таким образом, при условии, что весь объект rowHandles не равен нулю (быстрая проверка нуля может проверить это), вы будете выполнять итерацию по всем элементам, а если элементов нет, вы вообще не будете выполнять итерацию.

...