2017-02-03 4 views
-5

Например, если массив в Java: nums Когда мы оправдываем ли nums пуста или нет, мы должны DO-Почему мы должны делать это, когда оправдываем массив пустым?

if(nums == null || nums.length == 0) 

вместо просто

if(nums.length == 0) 

почему?

+3

Поскольку существует разница между массивом не существующим и массивом, не имеющем элементов. – nhouser9

+1

Чтобы позволить вызывающему абоненту передать значение «null» вместо создания массива 0-го размера, если данные не передаются. – Andreas

+0

Почему бы вам не установить 'nums = null' и попробовать оба и посмотреть, что вы получаете? –

ответ

2

Вы должны убедиться, что nums не является неопределенным первым, иначе попытка ссылки на свойство из неопределенного или нулевого объекта приведет к NullPointerException.

Кроме того, каждый из кусков кода имеет две совершенно разные вещи, и ваш случай, либо будет достаточно, как о том, что вы не должны «сделать что-то» с массивом:

nums == null  // This checks if your array exists 
nums.length == 0 // This checks if your array has no elements 
+1

«null» и «undefined» - это не одно и то же. На самом деле Java не использует этот термин. Он может быть «необъявленным» (вызвавший ошибку компиляции) или «неназначенным» (также компиляцией), но ссылочное значение «null» по-прежнему является четко определенным значением. – Andreas

+0

Это хороший момент @ Andreas. Прошло довольно много времени с тех пор, как я написал любую Java. Не стесняйтесь редактировать ответ, если вы чувствуете, что можете сделать его немного более «точным для Java». –

0

Рассмотрим этот набор методов:

public void breakEverything() { 
    MyClass[] bob; 
    // pass a null object to iterateArray 
    iterateArray(bob); 
} 

public void dontBreakStuff() { 
    MyClass[] bob = new MyClass[0]; 
    // pass an array of length 0 to iterateArray 
    iterateArray(bob); 
} 

public void iterateArray(int[] arr) { 
    for (int i == 0; i < arr.length; i++) { 
     doSomethingWith(arr[i]); 
    } 
} 

Там на самом деле пара вещей происходит здесь:

В случае метода breakEverything() - you'r e передает нулевую ссылку в метод iterateArray(). То есть аргумент arr имеет значение NULL, и, таким образом, вызов любых методов или обращение к любым переменным в этом аргументе вызовет NPE. Вы защищаете против этого, в том числе проверки:

if (arr == null) { 
    return; 
} 

Там в второй проблемы здесь с вопросом, хотя:

Когда мы оправдываем ли пусто НУМС или нет, мы должны делать, если (Nums = = нуль || nums.length == 0), а не только если (nums.length == 0)

проблема здесь состоит в том, что MyClass[].length() возвращает выделяется емкость массива, он фактически не возвращает количество элементов, которые вы разместили в массиве, то есть не считая числа ненулевых указателей. Возможно, вы думаете о ArrayList.size(), который фактически подсчитывает количество элементов в списке, а не выделенное пространство (это потому, что ArrayList может расти и сокращаться по размеру, где в качестве примитивного массива не может).

0

Если массив не инициализирован данными i.е

int[] nums=null; 
if(nums.length==0){} 

дает NullPointerException - потому, что вы пытаетесь получить доступ к информации, которая не существует

Если вы объявили, но не инициализируется массив со nums

int[] nums ; 
if(nums==null || nums.length==0){} 

дает сборник error - так как вы не инициализированы и пытаетесь получить к нему доступ

Короче nums==null это проверить Null

Смежные вопросы