线程 "Thread-0" java.lang.ArrayIndexOutOfBoundsException 中的异常:5
Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 5
一个新问题。
在我修复了一个数组之后,出现了这个错误:
Exception in thread "Thread-0"
java.lang.ArrayIndexOutOfBoundsException: 5 at
de.gandalf1783.Level.getTilesTouched(Level.java:37) at
de.gandalf1783.Creature.move(Creature.java:33) at
de.gandalf1783.Player.update(Player.java:19) at
de.gandalf1783.Game.update(Game.java:84) at
de.gandalf1783.Game.run(Game.java:54) at java.lang.Thread.run(Unknown
Source)
这是关卡class:
包 de.gandalf1783;
import java.awt.Graphics;
public class Level {
private TileSet[] ts;
private int sizeX, sizeY;
private int[][][] tileMap;
private Game game;
public Level(Game game, String path, TileSet[] ts1) {
this.game = game;
this.ts = ts1;
String file = Utils.loadFileAsString(path);
String[] tokens = file.split("\s");
sizeY = Utils.parseInt(tokens[1]);
tileMap = new int[1][sizeX][sizeY];
int i = 2;
for(int y = 0; y < sizeY; y++){
for(int x = 0; x < sizeX; x++){
tileMap[1][x][y] = Utils.parseInt(tokens[i++]);
}
}
}
public void renderMap(Graphics g){
for(int tileY = 0; tileY < sizeY; tileY++){
for(int tileX = 0; tileX < sizeX; tileX++){
ts[0].renderTile(g, tileMap[0][tileX][tileY], tileX * TileSet.TILEWIDTH - game.getGameCamera().getxOffset(),
tileY * TileSet.TILEHEIGHT - game.getGameCamera().getyOffset());
}
}
}
public int[][] getTilesTouched(Creature player) {
int[][] ret = new int[1][2];
int numX = (player.entityX + Player.MARGIN_HORIZ) / player.width;
int numY = (player.entityY + player.height - Player.MARGIN_VERT) / player.height;
ret[0][0] = tileMap[0][numX][numY];
if(ts[0].hs.contains(ret[0][0])) {
ret[0][0] <<= 16;
}
numX = (player.entityX + player.width - Player.MARGIN_HORIZ) / player.width;
ret[0][1] = tileMap[0][numX][numY];
if(ts[0].hs.contains(ret[0][1])) {
ret[0][1] <<= 16;
}
return ret;
}
public int getSizeX() {
// TODO Auto-generated method stub
return sizeX;
}
public int getSizeY() {
return sizeY;
}
}
它说程序正在中断,因为那里的数组是空的,还是我错了?
编辑 1:
导致问题的方法:
public int[][] getTilesTouched(Creature player) {
int[][] ret = new int[1][2];
int numX = (player.entityX + Player.MARGIN_HORIZ) / player.width;
int numY = (player.entityY + player.height - Player.MARGIN_VERT) / player.height;
ret[0][0] = tileMap[0][numX][numY];
if(ts[0].hs.contains(ret[0][0])) {
ret[0][0] <<= 16;
}
numX = (player.entityX + player.width - Player.MARGIN_HORIZ) / player.width;
ret[0][1] = tileMap[0][numX][numY];
if(ts[0].hs.contains(ret[0][1])) {
ret[0][1] <<= 16;
}
return ret;
}
这里是导致问题的行(第 37 行):
ret[0][0] = tileMap[0][numX][numY]
首先,sizeX
似乎从未被赋予有效值。
它的第一次用法在这里,结果是 [1][0][whatever]
tileMap = new int[1][sizeX][sizeY];
那么,这里
ret[0][0] = tileMap[0][numX][numY];
它确实会抛出一个 ArrayIndexOutOfBoundsException
,显然。
您可能希望在 Level
构造函数
中同时分配 sizeX
和 sizeY
final String[] tokens = file.split("\s");
sizeX = Utils.parseInt(tokens[0]);
sizeY = Utils.parseInt(tokens[1]);
我想这就是你想要的。
一个新问题。 在我修复了一个数组之后,出现了这个错误:
Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 5 at de.gandalf1783.Level.getTilesTouched(Level.java:37) at de.gandalf1783.Creature.move(Creature.java:33) at de.gandalf1783.Player.update(Player.java:19) at de.gandalf1783.Game.update(Game.java:84) at de.gandalf1783.Game.run(Game.java:54) at java.lang.Thread.run(Unknown Source)
这是关卡class: 包 de.gandalf1783;
import java.awt.Graphics;
public class Level {
private TileSet[] ts;
private int sizeX, sizeY;
private int[][][] tileMap;
private Game game;
public Level(Game game, String path, TileSet[] ts1) {
this.game = game;
this.ts = ts1;
String file = Utils.loadFileAsString(path);
String[] tokens = file.split("\s");
sizeY = Utils.parseInt(tokens[1]);
tileMap = new int[1][sizeX][sizeY];
int i = 2;
for(int y = 0; y < sizeY; y++){
for(int x = 0; x < sizeX; x++){
tileMap[1][x][y] = Utils.parseInt(tokens[i++]);
}
}
}
public void renderMap(Graphics g){
for(int tileY = 0; tileY < sizeY; tileY++){
for(int tileX = 0; tileX < sizeX; tileX++){
ts[0].renderTile(g, tileMap[0][tileX][tileY], tileX * TileSet.TILEWIDTH - game.getGameCamera().getxOffset(),
tileY * TileSet.TILEHEIGHT - game.getGameCamera().getyOffset());
}
}
}
public int[][] getTilesTouched(Creature player) {
int[][] ret = new int[1][2];
int numX = (player.entityX + Player.MARGIN_HORIZ) / player.width;
int numY = (player.entityY + player.height - Player.MARGIN_VERT) / player.height;
ret[0][0] = tileMap[0][numX][numY];
if(ts[0].hs.contains(ret[0][0])) {
ret[0][0] <<= 16;
}
numX = (player.entityX + player.width - Player.MARGIN_HORIZ) / player.width;
ret[0][1] = tileMap[0][numX][numY];
if(ts[0].hs.contains(ret[0][1])) {
ret[0][1] <<= 16;
}
return ret;
}
public int getSizeX() {
// TODO Auto-generated method stub
return sizeX;
}
public int getSizeY() {
return sizeY;
}
}
它说程序正在中断,因为那里的数组是空的,还是我错了?
编辑 1: 导致问题的方法:
public int[][] getTilesTouched(Creature player) {
int[][] ret = new int[1][2];
int numX = (player.entityX + Player.MARGIN_HORIZ) / player.width;
int numY = (player.entityY + player.height - Player.MARGIN_VERT) / player.height;
ret[0][0] = tileMap[0][numX][numY];
if(ts[0].hs.contains(ret[0][0])) {
ret[0][0] <<= 16;
}
numX = (player.entityX + player.width - Player.MARGIN_HORIZ) / player.width;
ret[0][1] = tileMap[0][numX][numY];
if(ts[0].hs.contains(ret[0][1])) {
ret[0][1] <<= 16;
}
return ret;
}
这里是导致问题的行(第 37 行):
ret[0][0] = tileMap[0][numX][numY]
首先,sizeX
似乎从未被赋予有效值。
它的第一次用法在这里,结果是 [1][0][whatever]
tileMap = new int[1][sizeX][sizeY];
那么,这里
ret[0][0] = tileMap[0][numX][numY];
它确实会抛出一个 ArrayIndexOutOfBoundsException
,显然。
您可能希望在 Level
构造函数
sizeX
和 sizeY
final String[] tokens = file.split("\s");
sizeX = Utils.parseInt(tokens[0]);
sizeY = Utils.parseInt(tokens[1]);
我想这就是你想要的。