java 赋值自定义对象数组 NullPointerException 异常
我正在开发一个五子棋游戏,里面要创建一个自定义对象的二维数组,我用了许多方法,总是出现NullPointerException异常。主要代码如下:publicclassC...
我正在开发一个五子棋游戏,里面要创建一个自定义对象的二维数组,我用了许多方法,总是出现NullPointerException异常。
主要代码如下:
public class Chessboard {
int width; //宽度
int height; //高度
int left; //左边距
int top; //上边距
int gridwidth; //方形网格宽度
Piece[][] pieces; //二维数组,表示棋盘上的棋子
Graphics graphics; //需要绘制的图形上下文对象
public Chessboard(int left,int top,int width,int height,int gridwidth){ //构造方法
this.width=width;
this.height=height;
this.left=left;
this.top=top;
this.gridwidth=gridwidth;
for(int x=0;x<=width;x++){
for(int y=0;y<=height;y++){
pieces[x][y]=new Piece(x,y,""); //遍历数组,为其赋值
}
}
}
注:Piece类已正确定义。
于是我在网上搜索这个异常的解决方法,搜索到一个类似的已解决问题:http://zhidao.baidu.com/question/405660838.html。
可是我发现,这个问题并不适合为我作参考。因为给pieces[][]赋值需要构造方法中的参数(x,y等),它的长度由x和y参数而定,而不是在定义成员变量的地方直接给它初始化赋值,因为还不能确定它的长度嘛。
这个问题令我纠结,因为如果采用其它方式表示棋子,改动它对于我的几千行代码来说可是个大工程。My God呀,妈妈咪呀,谁能拯救濒临困境的我!
我把Piece[][] pieces改成了Piece[][] pieces = new Piece[100][100],结果成功了,果然是因为没让系统分配空间的原因。可是我并不希望一开始就指定Piece[100][100]呀。 展开
主要代码如下:
public class Chessboard {
int width; //宽度
int height; //高度
int left; //左边距
int top; //上边距
int gridwidth; //方形网格宽度
Piece[][] pieces; //二维数组,表示棋盘上的棋子
Graphics graphics; //需要绘制的图形上下文对象
public Chessboard(int left,int top,int width,int height,int gridwidth){ //构造方法
this.width=width;
this.height=height;
this.left=left;
this.top=top;
this.gridwidth=gridwidth;
for(int x=0;x<=width;x++){
for(int y=0;y<=height;y++){
pieces[x][y]=new Piece(x,y,""); //遍历数组,为其赋值
}
}
}
注:Piece类已正确定义。
于是我在网上搜索这个异常的解决方法,搜索到一个类似的已解决问题:http://zhidao.baidu.com/question/405660838.html。
可是我发现,这个问题并不适合为我作参考。因为给pieces[][]赋值需要构造方法中的参数(x,y等),它的长度由x和y参数而定,而不是在定义成员变量的地方直接给它初始化赋值,因为还不能确定它的长度嘛。
这个问题令我纠结,因为如果采用其它方式表示棋子,改动它对于我的几千行代码来说可是个大工程。My God呀,妈妈咪呀,谁能拯救濒临困境的我!
我把Piece[][] pieces改成了Piece[][] pieces = new Piece[100][100],结果成功了,果然是因为没让系统分配空间的原因。可是我并不希望一开始就指定Piece[100][100]呀。 展开
6个回答
2015-12-18 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
对象数组不会自动初始化,才会NullPointerException 异常,所以要对每个元素初始化。
如:
JField []txt=new JField[4]; ------这里只是new了一个对象数组,并没有初始化数组元素
txt[0]=new JField();-------------因为对象数组不会自动初始化,所以要对每个元素初始化。
而平常见到的int、double等类型是基本数据类型,对于基本数据类型的数组,如果没有人为初始化,那么系统会自动初始化。
如:
JField []txt=new JField[4]; ------这里只是new了一个对象数组,并没有初始化数组元素
txt[0]=new JField();-------------因为对象数组不会自动初始化,所以要对每个元素初始化。
而平常见到的int、double等类型是基本数据类型,对于基本数据类型的数组,如果没有人为初始化,那么系统会自动初始化。
展开全部
在for 循环前面加上 pieces = new Piece[width][height]
报空指针应该是因为你没有告诉系统你要申请多大空间的数据,系统就没给你分配空间,没分配空间就找不到,找不到就空指针了。
报空指针应该是因为你没有告诉系统你要申请多大空间的数据,系统就没给你分配空间,没分配空间就找不到,找不到就空指针了。
更多追问追答
追问
试了一下……
居然发现了又一个异常~~~~~java.lang.ExceptionInInitializerError~~~~~
请问是何方异常?
追答
哪里报的错 ?
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在你for里初始化下
pieces = new Piece[width][height]
我看到你下面说的报个数组越界异常时因为
for(int x=0;x<=width;x++){
for(int y=0;y<=height;y++){
pieces[x][y]=new Piece(x,y,""); //遍历数组,为其赋值
}
}
这个循环 下标是从0开始的 结束要到你的width-1和height-1
要不你初始化时定pieces = new Piece[width+1][height+1]
pieces = new Piece[width][height]
我看到你下面说的报个数组越界异常时因为
for(int x=0;x<=width;x++){
for(int y=0;y<=height;y++){
pieces[x][y]=new Piece(x,y,""); //遍历数组,为其赋值
}
}
这个循环 下标是从0开始的 结束要到你的width-1和height-1
要不你初始化时定pieces = new Piece[width+1][height+1]
追问
嗯,谢谢!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的构造方法里面没有对数组的初始化
还有把你的等于去掉 长度为5的数组下标只能到4
还有把你的等于去掉 长度为5的数组下标只能到4
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Piece[][] pieces=null;
int height=0;
int width=0;
//可以需要时修改heigh,width
pieces=new Piece[height][width];
int height=0;
int width=0;
//可以需要时修改heigh,width
pieces=new Piece[height][width];
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询