Java Null Pointer Exception в многомерном массиве
Хорошо, первый пост здесь, так что кричите на меня, если я делаю что-то не так, но у меня есть следующий код, попытка заключить сделку с зонтиком для одного из тех грязных кругов старой школы. Однако я продолжаю получать некоторые ошибки нулевого указателя. Я часами гуглял и модифицировал эту проблему, и думаю, что пришло время попробовать что-то еще:P
Цель состоит в том, чтобы создать трехмерный массив для хранения экземпляров комнат. Если у вашего знакомого с комнатами грязи есть список аффиксов, а этот, в частности, имеет трехмерную сетку для координат каждой отдельной комнаты, пропускающую художественные метки для графики. Затем массив будет использоваться для отображения 2D-сетки пола для каждой высоты на JPanel с изображениями меток, основанными на состоянии выхода из комнаты. Проблема в том, что либо. конструктор не устанавливает мои переменные, что кажется маловероятным б. я использую это неправильно (вполне вероятно, поскольку я не очень знаком с Java) или c. Я упускаю из виду действительно легкую ошибку.
Ошибки появляются каждый раз, когда я пытаюсь получить доступ к переменной в классе Rooms.
package battle.org;
public class GUI extends JFrame {
public class Rooms{
String Rt;
String desc;
boolean dark;
boolean indoors;
boolean nomob;
boolean peace;
boolean soundproof;
boolean notrack;
boolean nomag;
boolean tunnel;
boolean notify;
boolean SF;
boolean FF;
boolean noport;
boolean noquit;
boolean exitu;
boolean exitd;
boolean onmap;
boolean exitud;
boolean exite;
boolean exitw;
boolean exits;
boolean exitn;
public Rooms(){
String Rt = "Room Name";
String desc = "Default Description";
dark = false;
indoors = false;
nomob = false;
peace = false;
soundproof = false;
notrack = false;
nomag = false;
tunnel = false;
notify = false;
SF = false;
FF = false;
noport = false;
noquit = false;
exitu = false;
exitd = false;
onmap = false;
exitud = false;
exite = false;
exitw = false;
exits = false;
exitn = false;
}
}
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GUI frame = new GUI();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public GUI() {
final int MAXxy = 10;
final int MAXz = 1;
int z;
Rooms[][][] a = new Rooms[MAXxy][MAXxy][MAXz];
// for(int x = 0; x < MAXxy; x++){
// for(int y = 0; y < MAXxy ; y++){
// for(z = 0; z < MAXz; z++){
// a[x][y][z] = new Rooms();
// }
// }
// }
//Labels to be displayed in grid
JLabel room = new JLabel(new ImageIcon("C:\\Users\\Owner\\Desktop\\room.jpg"));
JLabel nothing = new JLabel(new ImageIcon("C:\\Users\\Owner\\Desktop\\empty.jpg"));
JLabel up = new JLabel(new ImageIcon("C:\\Users\\Owner\\Desktop\\up.jpg"));
JLabel down = new JLabel(new ImageIcon("C:\\Users\\Owner\\Desktop\\down.jpg"));
//Error here wont let me access the boolean
a[0][0][0].onmap = true;
int x, y;
x =0; y =0; z = 0;
if(a[0][0][0].onmap){
System.out.print("X = " + x + " Y = " + y + " Z = " + z + "");
contentPane.add(down, new GridBagConstraints(x, y, 1, 1, 0.0, 0.0 ,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
}
//Displays Altitude level z
z = 0;
/* for(int x = 0; x < MAXxy; x++){
for(int y = 0; y < MAXxy ; y++){
if(a[0][0][0].onmap){
contentPane.add(down, new GridBagConstraints(x, y, 1, 1, 0.0, 0.0 ,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
}
}
}*/
}
}
Список ошибок:
java.lang.NullPointerException
at battle.org.GUI.<init>(GUI.java:189)
at battle.org.GUI$1.run(GUI.java:77)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(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.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)
2 ответа
Ваш массив заполнен нулями, потому что вы закомментировали бит, где вы его заполняете объектами Room.
Вот проблема: вы инициализируете Rooms[][][] a
массив, но никогда не инициализировать любое значение в нем. Таким образом, выполнение этой строки
a[0][0][0].onmap = true;
приводит к NullPointerException
,
Обязательно инициализируйте элементы в массиве. Основной пример:
for(int i = 0; i < MAXxy;i++) {
for(int j = 0; j < MAXxy; j++) {
for(int k = 0; k < MAXz; k++) {
a[i][j][k] = new Rooms();
}
}
}
Кстати, у вас есть похожий код, но он прокомментирован. Не забудьте раскомментировать или использовать предоставленный код.