2017-01-12 1 views
0

Я изучаю Java и хотел бы знать, можно ли построить объекты, находящиеся внутри массива, используя цикл foreach. Использование для цикла это очень легко:Использование foreach-loop для построения объектов в массиве

public class Bottle { 

    double waterAmount; 

    Bottle(){ 
     waterAmount = 1.0; 
    } 

    public static void main(String[] args) { 

     Bottle[] bottles = new Bottle[3]; 
     //foreach 
     for (Bottle bottle : bottles) { 
      bottle = new Bottle(); 
      System.out.println(bottle.waterAmount); 
     } 
     //for 
     for (int i = 0; i<bottles.length;i++){ 
      bottles[i] = new Bottle(); 
      System.out.println(bottles[i].waterAmount); 
     } 

     System.out.println("index 1: " + bottles[1].waterAmount); 
    } 
} 

Когда я бегу эту программу, используя цикл я получаю:

1.0 
1.0 
1.0 
index 1: 1.0 

который нормально, потому что массив бутылок был построен правильно. Когда я выполнить его, используя только Еогеасп есть выход:

1.0 
1.0 
1.0 
Exception in thread "main" java.lang.NullPointerException 
    at Bottle.main(Bottle.java:31) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

Так, насколько я понимаю, бутылка внутри Еогеаспа строит каждый объект бутылки, но тогда это не asigning этих новые бутылок к каждому индексу массива так поэтому я не могу ссылаться на бутылки [1]. WaterAmount.

+1

вы будете удивлены, но ответ здесь http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value –

+1

Возможный дубликат [Что такое исключение NullPointerException , и как его исправить?] (http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+2

Обновление локальной переменной 'bottle' внутри вашего цикла foreach никоим образом не будет изменять содержимое массива, из которого была инициализирована эта переменная. – azurefrog

ответ

2

Да, вы можете это сделать, но если бы я увидел эту конкретную конструкцию, я бы хотел знать, почему это было сделано именно так, а не просто использовать традиционный цикл for.

Try:

Bottle[] bottles = new Bottle[3]; 
    int counter = 0; 

    //foreach 
    for (Bottle bottle : bottles) { 
     bottles[counter] = new Bottle(); 
     System.out.println(bottles[counter].waterAmount); 
     counter++; 
    } 
+1

Я думал, что foreach - лучший вариант, но, как я вижу, он может создать некоторые проблемы, и стандарт для цикла в этом случае очень прост. Итак, вы должны использовать для цикла в этом случае? – codddeer123

+0

Я бы сказал, да, традиционная петля - лучшая. Мое рассуждение состоит в том, что вы хотели использовать счетчик в качестве индекса. foreach, на мой взгляд, больше подходит для коллекций, чем для массивов. –

+1

Несмотря на то, что этот код работает, ИМО это не очень читаемо: переменная 'bottle' не используется и может генерировать предупреждение (_ Значение локальной переменной-бутылки не используется_). –

1

Вы не можете.

Фактически вы сами это сказали в своем коде: for (Bottle bottle : bottles). Вы создаете новую переменную, бутылку типа Bottle, для которой foreach назначает текущую итерацию. Изменение локальной переменной (т. Е. Назначение нового значения с использованием нового) не будет иметь эффекта, оставив нулевые значения в исходном массиве.

Чтобы ответить на другой ответ: это не использует foreach, это просто злоупотребляет им для целей итерации; простой, хотя и работал бы.

+0

Вопрос: «[возможно ли] построить объекты, находящиеся внутри массива, используя цикл foreach?» Ответ - да, но это не «правильно». Ответ действительно использует foreach, об этом нет никаких костей. Он компилирует, запускает и реализует тот же эффект, что и традиционный для цикла. –

+0

Буквально да, семантически не очень. Это хороший трюк, если вы остаетесь в мире без времени и регулярно для цикла, но 1) вы обращаетесь к массиву из цикла и 2) используете счетчик. Это законный ответ, но нет такой ситуации, когда это решение имеет смысл. – Luke

+0

Я знаю, что он делает, и да, это законный ответ. Все, что вы сказали, я упомянул в своем ответе и в комментариях ниже. Что вы пытаетесь достичь здесь? Если вам не нравится вопрос, оставьте вопрос, а не решение. –