dizesi

2012-09-04 27 views
8

dizisindeki nesneleri başlatamıyor. Soruna hızlı bir şekilde daldım. Erişmeye çalıştığınızdadizesi

buffer = new Vector[8]; 
for(Vector v: buffer) 
    v = new Vector(); 

ama: Ben basit bir sınıf

class Vector{ 
    float x, y; 
} 

varsa ve başka sınıf Ben böyle başlatmak

Vector[] buffer; 

onun üyesi olarak bu nesnelerin dizisi vardır Bu nesnenin bu dizideki üyeleri bir NullPointerException'ı doğrudan yığın izlemem olsun. Yani, dizi nesneleri oluşturulmamıştır. Öte yandan bu daha geleneksel kod sadece mükemmel çalışır: tartışma it işaret

buffer = new Vector[8]; 
for(int i = 0; i<8; i++) 
    buffer[i] = new Vector; 

this gibi, her iki derleme sonra aynı olmalıdır.

Sorunun nedeni, her bir döngü için neden öğe dizisinden nesneleri başlatılamıyor/oluşturmuyor?

+0

Eğer 8 döngü yerine for döngüsünüzde buffer.length kullanırsanız, dizininizin boyutuna her zaman doğru olur. Aksi halde, bir 8'i değiştirirseniz ve diğerini değiştirmezseniz, son öğeleri kaçırırsınız veya bir dizi istisna dışında bir dizi alırsınız. – n00begon

+0

Sadece örnek uğruna oldu. Aslında loop.length için bir değişkene döngüden önce atanması ve koşul için kullanılması performans açısından biraz daha iyi - neredeyse göz ardı edilemez- ve benim sözleşmemdir. – mehmetminanc

+0

Tam olarak bu optimizasyon hakkında bir soru bile var http://stackoverflow.com/questions/1208320/what-is-the-cost-of-calling-array-length – n00begon

cevap

5

Her bir örnek için, döngüye geri kaydedilmeyen döngü yerel değişkeninin üzerine yazıyorsunuz. Bu sizin ikinci döngü gidiş benzer: temelde aynı sorunla ilgili dışarı Understanding for each loop in Java

for(int i = 0; i < buffer.length; i++){ 
    Vector v = buffer[i]; 
    v = new Vector(); 
} 

kontrol edin.

5

Her iki döngü de öğesinin bir dizideki öğelerine erişmesiyle aynıdır, ancak bunları başlatmak için değildir. Bu senaryoda bir for-each döngü kullandığınızda, bunun yerine yerel bir değişkene atamadan edilir Sen diziye yeni Vector atama değildir

for(int x = 0; x < array.length; x++) { 
    Vector v = array[x]; 
    v = new Vector(); 
} 

yapmak gibi.

2

İlk örneğinizde, v yalnızca for döngüsünün içinde kullanılabilir. Ne zaman v = new Vector(); v güncelleştirildi, ancak arabellek [i] değil. v önce [i] arabelleğe işaret ediyordu, şimdi yeni bir vektöre işaret ediyor, buffer[i]null olarak kalıyor.