2013-07-08 39 views
0

我希望能夠創造這樣的事情:試圖建立一個結構體數組的Java

int points = 250; 

public class point { 

    float x, y; 

} 

point[] p = new point[points]; 

// constructor 
public JavaMain() { 

    Random r = new Random(); 

    for (int i = 0; i < points; i++) { 

     int tx = r.nextInt(640) + 1; 
     int ty = r.nextInt(480) + 1; 

     p[i].x = (float)tx; 
     p[i].y = (float)ty; 

    } 
} 

的問題是,這種試圖將值分配給p[i].xp[i].y

時拋出了一個 NullPointerException

這是我在Java上的第一天,已經通過谷歌和StackOverflow做了一些研究,但沒有發現任何引起問題的核心問題。

+0

異常的等值線「主」顯示java.lang.NullPointerException – cookertron

+0

你需要初始化數組中的元素,以及不只是數組引用 –

+0

你能給我舉一個例子,請? – cookertron

回答

8

NullPointerException例外你正在由該線引起的:

p[i].x = (float)tx; 

你在哪裏試圖訪問在i位置存儲在p陣列內的對象的x屬性,但這種元件(或任何此數組內的其他元素)尚未設置,並且等於null。

爲了解決這個問題,加上這一行所提到的線以上:

p[i] = new point(); 
+0

完美,謝謝! – cookertron

+0

似乎很奇怪這樣做。我認爲它會爲初始聲明中的整個數組分配空間,就像在其他面向對象的語言中一樣。 – cookertron

+0

由於'point'不是原始類型,因此編譯器無法弄清楚如何初始化這種類型的數組。出於好奇,在哪個面向對象的語言中,它的工作方式有所不同? –

1

的問題是,當你初始化數組,你沒有初始化數組的元素。

在這行你

point[] p = new point[points]; 

所以,現在,p被初始化爲點的數組長度爲points

但是,你可以想像,這個陣列中,各個點的對象是未初始化(因此全部爲空)。因此,當您調用p[i].x = (float)tx;時,您在p [i]處取消引用點對象,但p [i]未初始化,因此您正在取消引用空指針。

你正在做

point p; 
p.x = 5; 
+0

感謝您的詳細解釋。我現在知道了。就像我上面提到的,初始化數組後初始化元素似乎很奇怪。在C++中,一旦爲數組分配了內存,數組索引指向內存中的位置,結構指向偏移量。 – cookertron

+0

非常歡迎!我可以理解你的困惑。 然而,這是一個有點不同,因爲我們正在處理的Java引用組成的數組,所以在C++的語法,你會做的是 點* P [] 所以你可以,如果你做了一些像寶潔這樣的想象[i] .x在這種情況下,你也會在C++中獲得一個空引用 –

相關問題