2013-03-28 24 views
-3

我正試圖爲學校設計一個非常簡單的模擬文明遊戲。現在我試圖做到這一點,當你點擊控制欄上的這個按鈕來創建一個新的小屋實例。我將把下面的錯誤報告和編碼錯誤發生的地方。類小屋陣列中的NullPointerException

錯誤報告:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at controls.Sidebar.clickBuildHut(Sidebar.java:102) 
at screen_window.Game_Window.mouseClicked(Game_Window.java:248) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Window.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$000(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

代碼發生錯誤:

public void newHut() { 
     numOfHuts++; 
     hut[numOfHuts] = new Hut(mouseX, mouseY, 0, numOfHuts); 
} 

小屋聲明在類的頂部:

Hut[] hut = new Hut[9999]; 
int numOfHuts; 

Sidebar.clickBuildHut方法:

public boolean clickBuildHut(int mouseX, int mouseY){ 
    if (viewConstruction){ 
     int topLeftX = x + 2; 
     int topLeftY = y + 50 - 14; 
     int selectionWidth = width - 10; 
     int selectionHeight = 17; 
     for (int i = 0; i <= width; i++) { 
      for (int h = 0; h <= height; h++) { 
       if (mouseX == topLeftX + i && mouseY == topLeftY + h) { 
        first_map.setEditMode(true); 
        game_window.newHut(); 
        return true; 
       } 
      } 
     } 
    } 
    return false; 
} 

first_map.setEditMode:

public void setEditMode(boolean editMode) { 
    this.editMode = editMode; 
} 

雖然我不認爲這是問題,因爲這是切換到真正的我正確地看到畫面的變化。如果你想讓我給你更多的信息,我可以,但我認爲它不會有任何用處,因爲它不是問題所在。

+1

'小屋[]小屋=新小屋[1234];' – jlordo

+3

你是否正在初始化'小屋'任何地方? – thejh

+1

您的堆棧跟蹤表明NPE發生在'clickBuildHut'方法中,但是您已經顯示了'newHut'方法。請顯示'clickBuildHut'方法。 – rgettman

回答

0

定位Sidebar.java的第102行。基於NPE位置的堆棧跟蹤。通過你的代碼的帖子我猜線102可以是:

first_map.setEditMode(true); 

game_window.newHut(); 

我說,因爲這些都是在clickBuildHut方法的唯一對象的引用。因此,first_map爲空或game_window爲空。

+0

謝謝你,你是對的。我解決了我的問題。 – Liam15

0

我沒有看到任何地方你讓iniilize hut陣列。你已經聲明瞭它,但是你沒有初始化它,所以Java默認它爲null

某處,你需要像這樣的東西來初始化:

hut = new Hut[size]; 

也許在構造函數中。

EDIT

在此基礎上現在顯示clickBuildHut方法,這取決於線的問題編輯實際上是線102,無論是first_mapgame_windownull

+0

我把我的小屋宣言改爲「Hut [] hut = new Hut [9999];」但我仍然收到相同的錯誤。 我也嘗試將它分開,因此它被宣佈爲「Hut [] hut;」那麼稍後它會被宣佈爲「hut = new Hut [9999]」。 – Liam15

+0

我爲first_map添加了方法,並解釋了爲什麼我不這麼認爲,那就是問題所在。 – Liam15