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

Почему int [] a = new int [0]; позволил?

Есть ли причина, по которой

int[] myArray = new int[0];

компилирует?

Можно ли использовать такое выражение?

myArray[0] = 1;

дает java.lang.ArrayIndexOutOfBoundsException.

if (myArray == null) {
    System.out.println("myArray is null.");
} else {
    System.out.println("myArray is not null.");
}

дает myArray is not null..

Поэтому я не вижу причины, по которой int[] myArray = new int[0] должен быть предпочтительнее myArray = null;.

4b9b3361

Ответ 1

Это просто для уменьшения нулевых проверок.

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

Рассмотрим код:

for (Integer i: myArray) {
   System.out.println(i);
}

В пустом массиве он ничего не печатает, по нуле вызывает NullPointerException.

Ответ 2

Почему бы и нет?

Вы можете получить массив со списком файлов .exe в каталоге. И этот каталог не может иметь файлов .exe.

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

UPDATE: больше точки, размер массива в Java определяется во время компиляции. Верно, что new int[0] можно обнаружить во время компиляции, но new int[System.currentTimeMillis % 10] не может. Поэтому проверка флага 0 во время компиляции не гарантирует, что вы не получите пустые массивы.

Ответ 3

Например:

public void getArraySum(int[] array) {
    int sum = 0;    

    for (int i = 0; i < array.length; i++)
        sum += array[i];

    return sum;
}

Это будет работать с пустым массивом, но не будет с ссылкой null.

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

Ответ 4

Да, есть, например, выполнение основного метода без параметров командной строки. Он дает вам массив размером 0, а не null.

Ответ 5

public int[] getData()
{
    if (iGotNothinForYa)
    {
        return new int[0];
    }

    int[] data = buildUpArray();
    return data;
}

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

int[] data = getData();
for (int i : data) // yay! no null check!
{
    doSomethingWith(i);
}

Ответ 6

 int[] myArray = new int[0];

Массивы в java являются регулярными объектами. Таким образом, выше код говорит, что размер массива равен нулю. Это особенно полезно для защиты от исключения Null указателя.

Подобно этому даже API коллекций есть способ инициализировать пустой держатель места.

 List<String> list = Collections.EMPTY_LIST;

Ответ 7

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

byte bLock = new byte[0];
// Thread T1 synchronizes on this empty array object
synchronize(bLock) {
    // perform some task while blocking other threads
    // synchronizing on bLock
}