2013-03-28 2 views
-3

Я пытаюсь создать довольно простую симуляционную игру цивилизации для школы. Сейчас я пытаюсь это сделать, когда вы нажимаете эту кнопку на панели управления, вы делаете новый экземпляр хижины. Я поставлю отчет об ошибке ниже и код, где происходит ошибка.NullPointerException в массиве класса Hut

Отчет об ошибках:

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[] 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

'Hut [] hut = new Hut [1234];' – jlordo

+3

Вы инициализируете 'hut' где угодно? – thejh

+1

Трассировка стека указывает, что NPE происходит в методе 'clickBuildHut', но вы указали метод' newHut'. Пожалуйста, покажите метод 'clickBuildHut'. – rgettman

ответ

0

Найти строку 102 боковой панели.java. На основе трассировки стека, которая является местоположением NPE. К вашему коду проводки я думаю линию 102 является:

first_map.setEditMode(true); 

или

game_window.newHut(); 

я говорю, потому что это единственные ссылки на объекты в методе clickBuildHut. Таким образом, либо first_map имеет значение null, либо game_window - null.

+0

Спасибо, ты был прав. Я исправил свою проблему. – Liam15

0

Я не вижу места, где вы iniailize массив hut. Вы объявили об этом, но вы его не инициализировали, поэтому Java по умолчанию использует его null.

Где-то, что вам нужно инициализировать его с чем-то вроде этого:

hut = new Hut[size]; 

возможно в конструкторе.

РЕДАКТИРОВАТЬ

Основываясь на вопрос редактирования, что теперь отображает метод clickBuildHut, в зависимости от того, какая линия на самом деле линии 102, либо first_map или game_window является null.

+0

Я изменил свою декларацию хижины на «Hut [] hut = new Hut [9999];» но я по-прежнему получаю ту же ошибку. Я также пробовал разделить его, чтобы он был объявлен «Хат [хижина]»; затем позже объявляется «hut = new Hut [9999]». – Liam15

+0

Я добавил метод для first_map и объяснил, почему я не думаю, что это проблема. – Liam15

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