arraycopy (): игнорирует ли Java аргументы индекса, когда аргумент длины равен 0? - PullRequest
4 голосов
/ 27 февраля 2011

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

Мое единственное предположение, что Java-реализация arraycopy () сначала проверяет, равна ли длина = 0, и если да, возвращает без проверки аргументов индекса? Я не могу найти ссылку на то, как работают внутренние функции arraycopy ().

Если именно так Java реализует это, и код работает нормально, моя интуиция говорит мне, что я все еще должен писать код, чтобы этого не произошло. Должен ли я беспокоиться об этом?

Код:

if (manyItems == data.length) {
        ensureCapacity(manyItems * 2 + 1); 
    }
    if (manyItems == currentIndex) {
        data[currentIndex] = element;
    } 
    else {   // if data.length = 10, manyItems = 9, currentIndex = 8,
                     //   currentIndex + 2 = 10, which is out of bounds.
                     //   But manyItems - currentIndex -1 = 0, so nothing is copied.
        System.arraycopy(data, currentIndex + 1, data, currentIndex + 2,
            manyItems - currentIndex - 1);
        data[currentIndex + 1] = element;
        currentIndex++;
    }

Мне кажется странным, но, может быть, я не продумываю это правильно? Должен ли я просто обеспечить емкость с manyItems> = data.length-1?

1 Ответ

2 голосов
/ 27 февраля 2011

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

...