Java распределенная связь NullPointerException - PullRequest
0 голосов
/ 28 мая 2020

Я пишу распределенную игру, в которой лог 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, но я не могу понять проблему.

...