2014-01-26 2 views
0

Рассмотрим следующий код, пытающийся добавить объект Product в productList, который представляет собой массив типа Product[].Java - Объект не задан?

public void addItem(Product product) { 

    for (Product p : productList) { 
     if (p != null){ 
      p = product; 
     } 
    } 

    System.out.println(productList[0]); // This yields null. 

} 

Как прокомментировал результаты печати в null. Почему продукт не устанавливается?

Обновление: Я выполнил отладочные отпечатки внутри предложения != null, и как объект, так и остальная часть предложения выполняются должным образом.

ответ

3

В переменной for-each-loop переменная p является временной переменной, которой будет присвоено содержимое productList. Таким образом, вы всегда просто назначаете временную переменную вместо элементов внутри списка.

Вы, наверное, хотите:

for (int i = 0; i < productList.length; i++) 
{ 
    if (productList[i] == null) 
    { 
     productList[i] = product; 
     break; 
    } 
} 

Без break вы бы назначить product к каждый элемент, который null (на самом деле было бы лучше использовать boolean с, чтобы справиться разрыв цикла, но это работает, тоже)

+1

Кроме того, я бы предположил, что 'addItem()' хотел бы вставить 'product' в первый * пустой * слот в' productList'. Так что это действительно должно быть 'p == null'. –

+0

Да, мои извинения за опечатки. Код был просто быстрым броском, чтобы представить проблему, а не фактический код, просто попытался сделать ее более читаемой. Благодаря! – krystah

2

Вы не можете использовать цикл for-each, также известный как «усиленный» цикл, для установки переменных массива, поскольку он использует временную переменную внутри цикла. Вы можете использовать его для изменения состояния объекта, уже сохраненного массивом, поскольку временная переменная будет ссылаться на тот же объект, но не на установку самой ссылки. Решение: используйте стандарт для цикла.

Из спецификации языка Java, §14.14.2:

Усиленные для утверждения эквивалентно основной для постановки формы:

for (I #i = Expression.iterator(); #i.hasNext();) { 
    VariableModifiersopt TargetType Identifier = 
     (TargetType) #i.next(); 
    Statement 
} 

Так что в вашем случае, свободно:

for (int n; n < productList.length; ++n) { 
    Product p = productList[n]; 
    if (p != null) { 
     p = product; 
    } 
} 

Из этого вы можете видеть, почему productList[0] никогда не устанавливается. p установлен на протяжении всей этой итерации цикла, но никогда productList[0].

+0

@TJ Я потерял дар речи в твоем редактировании ... спасибо! –

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