Тестирование пустого индекса массива

Я столкнулся с той же проблемой, используя Envoyer для Laravel - и это было довольно неприятно. Моим решением было следовать варианту 3) на https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1242376/comments/16

Создать Файл /etc/init/php5-fpm.override с отдельной строкой «сигнал перезагрузки USR2».

6
задан ChrisF 28 May 2009 в 20:05
поделиться

6 ответов

null здесь не проблема, но индекс недействителен. Массивы в C # основаны на 0, поэтому, если вы создаете массив с 1 элементом, допустим только индекс 0 :

array[0] == null

Этого можно избежать, проверив границы вручную перед доступом к индексу:

if (index < array.Length) {
    // access array[index] here
} else {
    // no exception, this is the "invalid" case
}
23
ответ дан 8 December 2019 в 02:24
поделиться
object[] arrayText = new object[1];

if (arrayText[0] == null)
{
    MessageBox.Show("Is null");
}

Попробовать? Массивы основаны на 0, поэтому попытка доступа к arrayText [1] приведет к исключению OutOfBoundsException. И команда try / catch не сильно повлияет на вашу производительность, в этот момент в стеке не так много всего.

11
ответ дан 8 December 2019 в 02:24
поделиться

Вы обращаетесь к индексу, который находится за пределами массива. Инициализатор массива принимает число для количества элементов, а не максимальный индекс (например, VB.NET). Поскольку массивы начинаются с нуля, ваш максимальный индекс в этом случае равен 0.

2
ответ дан 8 December 2019 в 02:24
поделиться

Проверьте .Length массива внутри цикла или, еще лучше, установите параметры цикла так, чтобы они были ограничены длиной массива.

object[] arrayText = new object[1];
for (int i = 0; i < arrayText.Length; i++)
{
    doWork(arrayText[i]);
}
1
ответ дан 8 December 2019 в 02:24
поделиться

Я думаю, проблема не в том, что arrayText 1 имеет значение null, а в том, что arrayText 1 не существует, поэтому вы должны получить исключение IndexOutOfRangeException, а не null

, если вы в ручье и не можете легко изменить код, чтобы проверить длину, вы можете подумать о добавлении функции, которая проверяет свойство Length (см. фрагмент ниже) или оператора перегрузки [] ... из них немного мерзко, но если вы в рассоле ... :)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace array
{
    class Program
    {
        static object Index(object [] array, int idx)
        {
            if (idx >= array.Length)
                return null;
            else
                return array[idx];
        }
        static void Main(string[] args)
        {
            object[] blah = new object[10];
            object o = Index(blah, 10);
        }
    }
}
1
ответ дан 8 December 2019 в 02:24
поделиться

Если вы прочтете описание создаваемого исключения, вы увидите, что это «Индекс был за пределами массива».

Новый объект [1] указывает, что массив имеет один элемент. (1 - счетчик) Однако начало индексации массива C # с 0, а не с 1, поэтому массив из одного элемента имеет индекс 0. Таким образом, arrayText [0] вернет null, но arrayText [1] вызовет исключение.

0
ответ дан 8 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: