Я пишу распределенную игру, в которой лог c находится на стороне сервера. При обработке сообщений все идет отлично, пока кусок не достигнет конца доски и я не получу ошибку NullPointerException. В это время фигура должна быть добавлена на доску, и MsgValidate должен вернуть false. Код, когда клиент подключается и обрабатывается:
public class ServerProtocol {
DataPlayer dataPlayer;
private static final TileType[] TILE_TYPES = new TileType[]{
TileType.TypeI, TileType.TypeJ, TileType.TypeL, TileType.TypeO, TileType.TypeS, TileType.TypeT, TileType.TypeZ
};
private TileType[][] tiles;
private static int cleared;
private static int currentRow;
public ServerProtocol(){
}
public DataPlayer MsgStart(Socket Cliente, ObjectInputStream entrada) {
try {
DataPlayer Player = new DataPlayer();
Player.setNome((String) entrada.readObject());
Player.setDificuldade((String) entrada.readObject());
Player.setScore(0);
tiles = new TileType[22][10];
for(int i = 0; i < 22; i++) {
for(int j = 0; j < 10; j++) {
tiles[i][j] = null;
}
}
currentRow = 0;
cleared = 0;
return Player;
} catch (IOException | ClassNotFoundException ex) {
System.out.println(ex.getMessage());
}
return null;
}
public boolean MsgValidate(String typeS, int x, int y, int rotation) {
boolean a = false;
TileType type = null;
for (int i = 0; i < TILE_TYPES.length && type == null; i++) {
if (typeS.equals(TILE_TYPES[i].toString())) {
type = TILE_TYPES[i];
}
}
if (type == null) {
return false;
}
if(isValidAndEmpty(typeS, x, y, rotation) == true) {
currentRow++;
a = true;
} else if(isValidAndEmpty(typeS, x, y, rotation) == false) {
addPiece(type, x, y-1, rotation);
cleared = checkLines();
a = false;
}
return a;
}
public boolean isValidAndEmpty(String typeS, int x, int y, int rotation) {
TileType type = null;
for (int i = 0; i < TILE_TYPES.length && type == null; i++) {
if (typeS.equals(TILE_TYPES[i].toString())) {
type = TILE_TYPES[i];
}
}
if (type == null) {
// or throw an IllegalArgumentException
return false;
}
if(x < -type.getLeftInset(rotation) || x + type.getDimension() - type.getRightInset(rotation) >= 10) {
return false;
}
if(y < -type.getTopInset(rotation) || y + type.getDimension() - type.getBottomInset(rotation) >= 22) {
return false;
}
for(int col = 0; col < type.getDimension(); col++) {
for(int row = 0; row < type.getDimension(); row++) {
if(type.isTile(col, row, rotation) && isOccupied(x + col, y + row)) {
return false;
}
}
}
return true;
}
private boolean isOccupied(int x, int y) {
if (tiles == null) {
return false;
} else if (y < 0 || y >= tiles.length) {
return false;
} else if (x < 0 || x >= tiles[y].length) {
return false;
}
return tiles[y][x] != null;
}
public void addPiece(TileType type, int x, int y, int rotation) {
for(int col = 0; col < type.getDimension(); col++) {
for(int row = 0; row < type.getDimension(); row++) {
if(type.isTile(col, row, rotation)) {
setTile(col + x, row + y, type);
}
}
}
}
public int checkLines() {
int completedLines = 0;
for(int row = 0; row < 22; row++) {
if(checkLine(row)) {
completedLines++;
}
}
return completedLines;
}
private boolean checkLine(int line) {
for(int col = 0; col < 10; col++) {
if(!isOccupied(col, line)) {
return false;
}
}
for(int row = line - 1; row >= 0; row--) {
for(int col = 0; col < 10; col++) {
setTile(col, row + 1, getTile(col, row));
}
}
return true;
}
private void setTile(int x, int y, TileType type) {
tiles[y][x] = type;
}
private TileType getTile(int x, int y) {
return tiles[y][x];
}
}
Трассировка стека ошибок:
Exception in thread "Thread-21" java.lang.NullPointerException
at Servidor.ServerProtocol.setTile(ServerProtocol.java:337)
at Servidor.ServerProtocol.addPiece(ServerProtocol.java:296)
at Servidor.ServerProtocol.MsgValidate(ServerProtocol.java:205)
at Servidor.Server.run(Server.java:183)
at java.base/java.lang.Thread.run(Thread.java:830)
Ошибка появляется, когда фигуры добавляются на доску с помощью метод setTile, но я не могу понять проблему.