Подтвердить что ты не робот

Длина массива Java меньше 0?

Я проходил проект с открытым исходным кодом, где они создавали выходной поток, и натолкнулся на следующий метод:

@Override public void write(byte[] buffer, int offset, int length) {
    if (buffer == null) {
        throw new NullPointerException("buffer is null");
    }
    if (buffer.length < 0) { // NOTE HERE
        throw new IllegalArgumentException("buffer length < 0");
    }
    if (offset < 0) {
        throw new IndexOutOfBoundsException(String.format("offset %d < 0", offset));
    }
    if (length < 0) {
        throw new IndexOutOfBoundsException(String.format("length %d < 0", length));
    }
    if (offset > buffer.length || length > buffer.length - offset) {
        throw new IndexOutOfBoundsException(String.format("offset %d + length %d > buffer"                                                       " length %d", offset, length, buffer.length));
    }
}

Итак, byte[] buffer является обычным старым byte[]. Мы знаем, что это не пусто. Можно ли даже сделать его длиной менее 0? Например, возможно ли это сделать с отражением и тем, что они защищают?

4b9b3361

Ответ 1

Нет, этого никогда не случится. Длина гарантируется как неотрицательная по спецификациям Java.

Элементы типа массива являются следующими:

  • Публичная конечная длина поля, которая содержит количество компонентов массива. длина может быть положительной или нулевой.

Источник: JLS §10.7

Как упоминалось в mprivat, если вы когда-нибудь попытаетесь создать массив отрицательного размера, будет выброшен NegativeArraySizeException.

Ответ 2

Я не думаю, что это возможно. Даже через отражение он охраняется с помощью NegativeArraySizeException

Ответ 3

Это просто проблема с обработкой исключений. Вам разрешено создавать массив с отрицательным размером в Java - он даже не генерирует исключение при его компиляции. Но во время выполнения ваша программа не будет работать, пока это не будет исправлено. (Он выкинет NegativeArraySizeException.)

Проблема заключается в том, что это исключение выбрасывается во время выполнения вместо времени компиляции - для чего исключение обрабатывается с помощью IllegalArgumentException.