多维数组中的Java空指针异常
好的,第一篇帖子,如果我做错了什么,就对我大喊大叫,但我有以下代码,试图为那些老派的circle mud之一做一个类似区域构建者的交易。但是,我不断得到一些空指针错误。我已经在谷歌上搜索和修改了好几个小时,我想是时候尝试一下其他的东西了:P 其目的是创建一个三维阵列来存储房间实例。如果你对mud的房间很熟悉的话,你会看到一个词缀列表,特别是这个列表有一个三维网格,用于每个房间的坐标,通过艺术标签进行图形显示。然后,该阵列将用于显示JPanel上每个高度的二维地板网格,以及基于房间出口状态的标签图片。问题似乎是a。构造函数没有设置我的变量,这似乎不太可能。我用错了(很可能是因为我不太熟悉java)或c。我忽略了一些很容易犯的错误 每当我试图访问Rooms类中的变量时,错误就会出现多维数组中的Java空指针异常,java,user-interface,multidimensional-array,nullpointerexception,mud,Java,User Interface,Multidimensional Array,Nullpointerexception,Mud,好的,第一篇帖子,如果我做错了什么,就对我大喊大叫,但我有以下代码,试图为那些老派的circle mud之一做一个类似区域构建者的交易。但是,我不断得到一些空指针错误。我已经在谷歌上搜索和修改了好几个小时,我想是时候尝试一下其他的东西了:P 其目的是创建一个三维阵列来存储房间实例。如果你对mud的房间很熟悉的话,你会看到一个词缀列表,特别是这个列表有一个三维网格,用于每个房间的坐标,通过艺术标签进行图形显示。然后,该阵列将用于显示JPanel上每个高度的二维地板网格,以及基于房间出口状态的标签图
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));
}
}
}*/
}
}
package battle.org;
公共类GUI扩展JFrame{
公共教室{
字符串Rt;
字符串描述;
布尔暗;
室内;
布尔nomob;
布尔和平;
布尔隔音;
布尔notrack;
布尔nomag;
布尔隧道;
布尔通知;
布尔SF;
布尔FF;
布尔无端口;
布尔noquit;
布尔exitu;
布尔存在;
布尔映射;
布尔存在;
布尔出口;
布尔exitw;
布尔出口;
布尔存在;
公共房间(){
String Rt=“房间名称”;
String desc=“默认描述”;
暗=假;
室内=假;
nomob=假;
和平=虚假;
隔音=假;
notrack=false;
nomag=假;
隧道=假;
通知=假;
SF=假;
FF=假;
noport=false;
noquit=false;
exitu=假;
exitd=false;
onmap=false;
exitud=false;
exite=false;
exitw=false;
退出=假;
exitn=假;
}
}
私有JPanel内容窗格;
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
GUI框架=新GUI();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
/**
*创建框架。
*/
公共图形用户界面(){
最终整数MAXxy=10;
最终int MAXz=1;
intz;
房间[][]a=新房间[MAXxy][MAXxy][MAXz];
//对于(int x=0;x
错误列表:
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)
java.lang.NullPointerException
在battle.org.GUI上(GUI.java:189)
在battle.org.GUI$1.run(GUI.java:77)
在java.awt.event.InvocationEvent.dispatch(未知源)处
位于java.awt.EventQueue.dispatchEventImpl(未知源)
位于java.awt.EventQueue.access$200(未知源)
在java.awt.EventQueue$3.run处(未知源)
在java.awt.EventQueue$3.run处(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)
位于java.awt.EventQueue.dispatchEvent(未知源)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(未知源)
位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源)
位于java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.run(未知源)
您的数组充满了空值,因为您注释掉了用房间对象填充它的位。问题是:您初始化了房间[][[]数组,但从未初始化其中的任何值。因此,这一行的执行
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();
}
}
}
for(int i=0;i
顺便说一句,您有一个类似的代码,但有注释。确保取消注释或使用提供的代码。GUI frame=n