解析文件以制作游戏地图时出现 NullPointerException
NullPointerException when parsing file to make game map
我正在制作一款 2D 小游戏,可以从上方观看。我正在尝试这样做:
1) 我有一个包含地图布局的 .txt 本地文件
2) 解析此文件并在游戏中制作地图布局
3) 在屏幕上绘制所有内容
我(认为是)成功解析文件并将其放入应用程序,但它无法绘制,抛出 NullPointerException。我知道这里有些东西是空的,但我看不到是什么和在哪里 - 从我的角度来看,一切都在它应该在的地方。
一些代码:
BufferedReader br = new BufferedReader(new FileReader(s) );
mapwidth = Integer.parseInt(br.readLine());
mapheight = Integer.parseInt(br.readLine());
String delimiters = " ";
for (row = 0; row < mapheight; row++){
String line = br.readLine();
String[] tokens = line.split(delimiters);
for (col = 0; col < mapwidth ; col++){
map[row][col] = Integer.parseInt(tokens[col]);
}
}
这是将文件解析为程序的函数。前两行读取地图宽度和高度(来自所述文件),然后对于文件中的每个值,我在 map[row][col]
中创建一个点
这是另一个负责为地图的每个点制作对象的函数
String wall ="Images/wall.jpg";
BufferedImage WALL = ImageIO.read(new File(wall));
if (map[row][col] == 0) { tile[row][col] = new Tile(WALL, false, true, false); }
最后一行抛出 NullPointerException。
Tile 是我游戏中的一个字段。它有四个值——BufferedImage、blocked、walkable 和 destructable(最后三个是布尔值)。
另外,如果我把制作对象的代码和解析代码放在一起也没关系。我仍然有例外。
我知道这里缺少一些东西,但我不知道是什么。
稍后我想绘制所有瓷砖:
public void paint(Graphics g){
for (row=0; row < mapheight; row++)
for(col = 0; col < mapwidth; col++){
g.drawImage(
tile[row][col].getImage(),
row*tileSize,
col*tileSize,
null
);
我认为它可能有一些错误,但我不确定。我想要做的是获取每个图块的图像并将其绘制在适当的行和列中。每个字段都是一个正方形(长度 = tileSize)。
编辑
谢谢大家!
@Thierry - 调试后我发现 tile 仍然是 null 并且没有填满。所以,我制作了一个空的 tile 实例并将这两个函数放在一起。现在它看起来像这样并且可以正常工作:
public GameTileMap(String s, int tileSize){
this.tileSize = tileSize;
try{
BufferedReader br = new BufferedReader(new FileReader(s) );
mapwidth = Integer.parseInt(br.readLine());
mapheight = Integer.parseInt(br.readLine());
map = new int[mapheight][mapwidth];
tile = new Tile[mapheight][mapwidth];
int mh = mapheight;
int mw = mapwidth ;
String delimiters = " ";
for (row = 0; row < mh; row++){
String line = br.readLine();
String[] tokens = line.split(delimiters);
for (col = 0; col < mw ; col++){
map[row][col] = Integer.parseInt(tokens[col]);
}
}
String wall ="Images/wall.jpg";
String brick = "Images/brick.jpg";
String grass ="Images/grass.jpg";
String water = "Images/water.jpg";
BufferedImage WALL = ImageIO.read(new File(wall));
BufferedImage BRICK = ImageIO.read(new File(brick));
BufferedImage GRASS = ImageIO.read(new File(grass));
BufferedImage WATER = ImageIO.read(new File(water));
for (row = 0; row < mh; row++){
for (col = 0; col < mw ; col++){
if (map[row][col] == 0) { tile[row][col] = new Tile(GRASS, false, true, false); }
else if (map[row][col] == 1) {tile[row][col] = new Tile(BRICK, true, false, true);}
else if (map[row][col] == 2) {tile[row][col] = new Tile(WALL, true, false, false);}
else if (map[row][col] == 3) {tile[row][col] = new Tile(WATER, false, false, false);}
else {tile[row][col] = new Tile(GRASS, false, true, false);};
}
}
}
catch(Exception e){
e.printStackTrace();}
}
执行此操作后:
for (row = 0; row < mapheight; row++){
String line = br.readLine();
String[] tokens = line.split(delimiters);
for (col = 0; col < mapwidth ; col++){
map[row][col] = Integer.parseInt(tokens[col]);
}
}
row
和 col
都会越界,因为最后的 row++ 和 col++。这就是为什么您在尝试访问 if (map[row][col] == 0)
时遇到越界错误的原因
数组中的 NullPointerException
意味着您以某种方式引用小于 0 或大于 length()-1[=23= 的索引].
如果您在 :
中有 NPE
if (map[row][col] == 0) { tile[row][col] = new Tile(WALL, false, true, false);
那么只有4种解法:
- 地图为空
- 或地图[行]为空
- 或磁贴为空
- 或 tile[row] 为空
我正在制作一款 2D 小游戏,可以从上方观看。我正在尝试这样做:
1) 我有一个包含地图布局的 .txt 本地文件
2) 解析此文件并在游戏中制作地图布局
3) 在屏幕上绘制所有内容
我(认为是)成功解析文件并将其放入应用程序,但它无法绘制,抛出 NullPointerException。我知道这里有些东西是空的,但我看不到是什么和在哪里 - 从我的角度来看,一切都在它应该在的地方。
一些代码:
BufferedReader br = new BufferedReader(new FileReader(s) );
mapwidth = Integer.parseInt(br.readLine());
mapheight = Integer.parseInt(br.readLine());
String delimiters = " ";
for (row = 0; row < mapheight; row++){
String line = br.readLine();
String[] tokens = line.split(delimiters);
for (col = 0; col < mapwidth ; col++){
map[row][col] = Integer.parseInt(tokens[col]);
}
}
这是将文件解析为程序的函数。前两行读取地图宽度和高度(来自所述文件),然后对于文件中的每个值,我在 map[row][col]
中创建一个点这是另一个负责为地图的每个点制作对象的函数
String wall ="Images/wall.jpg";
BufferedImage WALL = ImageIO.read(new File(wall));
if (map[row][col] == 0) { tile[row][col] = new Tile(WALL, false, true, false); }
最后一行抛出 NullPointerException。 Tile 是我游戏中的一个字段。它有四个值——BufferedImage、blocked、walkable 和 destructable(最后三个是布尔值)。 另外,如果我把制作对象的代码和解析代码放在一起也没关系。我仍然有例外。 我知道这里缺少一些东西,但我不知道是什么。
稍后我想绘制所有瓷砖:
public void paint(Graphics g){
for (row=0; row < mapheight; row++)
for(col = 0; col < mapwidth; col++){
g.drawImage(
tile[row][col].getImage(),
row*tileSize,
col*tileSize,
null
);
我认为它可能有一些错误,但我不确定。我想要做的是获取每个图块的图像并将其绘制在适当的行和列中。每个字段都是一个正方形(长度 = tileSize)。
编辑
谢谢大家!
@Thierry - 调试后我发现 tile 仍然是 null 并且没有填满。所以,我制作了一个空的 tile 实例并将这两个函数放在一起。现在它看起来像这样并且可以正常工作:
public GameTileMap(String s, int tileSize){
this.tileSize = tileSize;
try{
BufferedReader br = new BufferedReader(new FileReader(s) );
mapwidth = Integer.parseInt(br.readLine());
mapheight = Integer.parseInt(br.readLine());
map = new int[mapheight][mapwidth];
tile = new Tile[mapheight][mapwidth];
int mh = mapheight;
int mw = mapwidth ;
String delimiters = " ";
for (row = 0; row < mh; row++){
String line = br.readLine();
String[] tokens = line.split(delimiters);
for (col = 0; col < mw ; col++){
map[row][col] = Integer.parseInt(tokens[col]);
}
}
String wall ="Images/wall.jpg";
String brick = "Images/brick.jpg";
String grass ="Images/grass.jpg";
String water = "Images/water.jpg";
BufferedImage WALL = ImageIO.read(new File(wall));
BufferedImage BRICK = ImageIO.read(new File(brick));
BufferedImage GRASS = ImageIO.read(new File(grass));
BufferedImage WATER = ImageIO.read(new File(water));
for (row = 0; row < mh; row++){
for (col = 0; col < mw ; col++){
if (map[row][col] == 0) { tile[row][col] = new Tile(GRASS, false, true, false); }
else if (map[row][col] == 1) {tile[row][col] = new Tile(BRICK, true, false, true);}
else if (map[row][col] == 2) {tile[row][col] = new Tile(WALL, true, false, false);}
else if (map[row][col] == 3) {tile[row][col] = new Tile(WATER, false, false, false);}
else {tile[row][col] = new Tile(GRASS, false, true, false);};
}
}
}
catch(Exception e){
e.printStackTrace();}
}
执行此操作后:
for (row = 0; row < mapheight; row++){
String line = br.readLine();
String[] tokens = line.split(delimiters);
for (col = 0; col < mapwidth ; col++){
map[row][col] = Integer.parseInt(tokens[col]);
}
}
row
和 col
都会越界,因为最后的 row++ 和 col++。这就是为什么您在尝试访问 if (map[row][col] == 0)
NullPointerException
意味着您以某种方式引用小于 0 或大于 length()-1[=23= 的索引].
如果您在 :
中有 NPEif (map[row][col] == 0) { tile[row][col] = new Tile(WALL, false, true, false);
那么只有4种解法:
- 地图为空
- 或地图[行]为空
- 或磁贴为空
- 或 tile[row] 为空