我正在尝试解决以下问题:
给定一个 Player 类 - 一个可以与其他 Player 进行通信的实例。
要求如下:
- 创建 2 个 Player 实例
- 其中一名玩家应向第二名玩家发送消息(我们称该玩家为“发起者”)
- 当玩家收到消息时,它应该回复一条消息,其中包含收到的消息以及保存该玩家已发送消息数量的计数器的值。
- 两个播放器应该在同一个 java 进程中运行(强烈要求)
这是我的代码:
package play;
public class PlayerInteractions {
static String concatenatedCounts="";
public static void main(String[] args) {
//initiator object
Player initiator=new Player(1, "Player1");
//receiver object
Player receiver =new Player(2, "Player2");
//initiator sends a message to receiver, as an example we sent the string "message_test"
initiator.sendMessage("hello", receiver);
}
}
package play;
import java.util.ArrayList;
import java.util.List;
public class Player {
//player attributes
private int id;
private String playerName;
private List<String> sentMessagesList=new ArrayList<String>();
private String concatenatedPlayerCounts="";
//getters and setters
public List<String> getSentMessagesList() {
return sentMessagesList;
}
public void setSentMessagesList(List<String> sentMessagesList) {
this.sentMessagesList = sentMessagesList;
}
public int getID() {
return id;
}
public void setID(int iD) {
id = iD;
}
public String getPlayerName() {
return playerName;
}
public void setPlayerName(String playerName) {
this.playerName = playerName;
}
//ToString
@Override
public String toString() {
return "Player [ID=" + id + ", playerName=" + playerName + "]";
}
//Constructor
public Player(int iD, String playerName) {
super();
id = iD;
this.playerName = playerName;
}
//Function to send a message
protected void sendMessage(String message, Player receiver) {
//add message to the list of received messages and the list of sent messages
this.getSentMessagesList().add(message);
String originalMessage=this.getSentMessagesList().get(0);
//print messages and count while count is less than 10 sendMessage is called recursively
if(receiver.getSentMessagesList().size()<10000) {
int sentMessagesSize = this.getSentMessagesList().size()-1;
//concatenate number of messages already sent
PlayerInteractions.concatenatedCounts=PlayerInteractions.concatenatedCounts+""+this.concatenatedPlayerCounts+""+sentMessagesSize+"";
//print statement
System.out.println(this.getPlayerName()+ ": "+ originalMessage+""+PlayerInteractions.concatenatedCounts+"");
//recursive call to sendMessage
receiver.sendMessage(message, this);
}
}
}
我遇到的问题是,当我使用 10000 次迭代时,我在以下代码行中收到 StackOverflow 错误:if(receiver.getSentMessagesList().size()<10000) {
当我使用较小的数字(例如 10 或 100)时,代码工作正常,但是当我使用 10000 时,代码会崩溃。如何修复此问题并且不再收到此错误?
最佳答案
当您在此处发送消息时,您将调用接收者的 sendMessage
方法。这将调用发送者的方法。然后再次接收器。依此类推,直到您在处理一条消息时达到 10000 阈值。
一些提示:
- 您的作业要求您应返回消息以及已发送消息的数量。为此使用 int。
- 您需要一个单独的方法来接收消息。
- 该作业并不要求您实际存储消息。
最小的解决方案可能是这样的:
public class Player {
private int numberOfSentMessages = 0;
public void sendMessage(final String message, final Player receiver) {
receiver.receiveMessage(message);
numberOfSentMessages++;
}
public String receiveMessage(final String message) {
return message + numberOfSentMessages;
}
}
关于java - 使用高停止条件 10000 时如何修复 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68711775/