Я устанавливаю связь между клиентом и сервером, и одно из сообщений является перечислением. Для обработки на стороне сервера и преобразования значения перечисления клиента с помощью .toString () и на стороне сервера в зависимости от полученного значения созданная переменная получает значение перечисления. Код относится к стороне сервера, а ошибка относится к протоколу сервера:
if(x < -type.getLeftInset(rotation) || x + type.getDimension() - type.getRightInset(rotation) >= 10) {
return false;
}
Код для протокола сервера:
package Servidor;
import Servidor.TileType;
// Server side protocol
public class ServerProtocol {
//HighScore HighScore = null;
//private HighScore hs;
DataPlayer dataPlayer;// = null;
private TileType[][] tiles;
private int lines, score, newLevel, level;
private static TileType type;
public ServerProtocol(){
TileType type = TileType.TypeJ;
}
public boolean MsgValidate(String typeS, int x, int y, int rotation) {
if(typeS == TileType.TypeI.toString()) {
type = TileType.TypeI;
}
if(typeS == TileType.TypeJ.toString()) {
type = TileType.TypeJ;
}
if(typeS == TileType.TypeL.toString()) {
type = TileType.TypeL;
}
if(typeS == TileType.TypeO.toString()) {
type = TileType.TypeO;
}
if(typeS == TileType.TypeS.toString()) {
type = TileType.TypeS;
}
if(typeS == TileType.TypeT.toString()) {
type = TileType.TypeT;
}
if(typeS == TileType.TypeZ.toString()) {
type = TileType.TypeZ;
}
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) {
return tiles[y][x] != null;
}
}
Сервер, который вызывает протокол сервера, имеет код:
package Servidor;
import Servidor.TileType;
public class Server implements Runnable {
public static final String HighScore = null;
public Socket server = null;
private TileType[][] tiles;
public Server(Socket socket){
this.server = socket;
}
public static void main (String[] args) throws IOException, ClassNotFoundException{
int port = 6666;
try(ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("Server is listening on port: " + port + "\n\n");
while(true) {
Socket socket = serverSocket.accept();
System.out.println("----------------------------------------------------------------------------------------------------");
System.out.println("Communication accepted: " + socket.getInetAddress().getHostAddress() /*+ "\n"*/);
Server server = new Server(socket);
Thread t = new Thread(server);
t.start();
}
}catch(Exception e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
ServerProtocol Comunicao = new ServerProtocol();
public void run() {
ObjectInputStream input;
try {
input = new ObjectInputStream(server.getInputStream());
String Msg = (String) input.readObject();
System.out.println(Msg);
if (Msg.equals("Start")) {
System.out.println("Start");
return;
}
if(Msg.equals("Validate")) {
String typeS = (String) input.readObject();
System.out.println("Type: " + typeS);
int x = (int) input.readObject();
System.out.println("X: " + x);
int y = (int) input.readObject();
System.out.println("Y: " + y);
int rotation = (int) input.readObject();
System.out.println("Rotation: " + rotation);
boolean answer = Comunicao.MsgValidate(typeS, x, y, rotation);
if(answer == false) {
System.out.println("Invalid move");
ObjectOutputStream saida = new ObjectOutputStream(server.getOutputStream());
saida.writeObject("Invalid move");
} else if(answer == true) {
System.out.println("Valid move");
ObjectOutputStream saida = new ObjectOutputStream(server.getOutputStream());
saida.writeObject("Valid move");
}
}
}catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Я думаю, что ошибка может быть из-за того, что он не инициализирован, а сделал это в начале кода протокола сервера. Трассировка стека ошибок:
Exception in thread "Thread-1" java.lang.NullPointerException
at Servidor.ServerProtocol.MsgValidate(ServerProtocol.java:224)
at Servidor.Server.run(Server.java:138)
at java.base/java.lang.Thread.run(Thread.java:830)