java如何修复使用高停止条件时的StackOverflowerError
我正在尝试解决以下问题:
给定一个玩家类-一个可以与其他玩家通信的实例
要求如下:
- 创建2个玩家实例
- 其中一个玩家应该向第二个玩家发送消息(让我们称这个玩家为“发起人”)
- 当播放机接收到消息时,它应该用一条消息进行回复,该消息包含接收到的消息,该消息与保存该播放机已发送消息数量的计数器的值连接在一起李>
- 两个玩家应该在同一个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次迭代时,代码崩溃。我如何修复此问题而不再收到此错误
# 1 楼答案
当您在此处发送消息时,您将调用接收方的
sendMessage
方法。它将调用发送方的方法。然后又是听筒。以此类推,直到您在处理一条消息时达到10000阈值几点建议:
最低限度的解决方案可能如下所示: