使用高停止条件 10000 时如何修复 StackOverflowError
How to fix StackOverflowError when using a high stopping condition 10000
我正在尝试解决以下问题:
给定一个 Player class - 一个可以与其他 Player 通信的实例。
要求如下:
- 创建 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 次迭代时,我在以下代码行中收到 Whosebug 错误:if(receiver.getSentMessagesList().size()<10000) {
当我使用较小的数字时,代码工作正常,例如作为 10 或 100 但是当我使用 10000 时它崩溃了。我怎样才能解决这个问题并且不再收到这个错误?
在这里发送消息时,会调用接收方的sendMessage
方法。这将调用发件人的方法。然后再次接收。依此类推,直到您在处理一条消息时达到 10000 个阈值。
一些提示:
- 你的作业说你应该 return 消息以及已发送消息的数量。为此使用 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;
}
}
我正在尝试解决以下问题:
给定一个 Player class - 一个可以与其他 Player 通信的实例。
要求如下:
- 创建 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 次迭代时,我在以下代码行中收到 Whosebug 错误:if(receiver.getSentMessagesList().size()<10000) {
当我使用较小的数字时,代码工作正常,例如作为 10 或 100 但是当我使用 10000 时它崩溃了。我怎样才能解决这个问题并且不再收到这个错误?
在这里发送消息时,会调用接收方的sendMessage
方法。这将调用发件人的方法。然后再次接收。依此类推,直到您在处理一条消息时达到 10000 个阈值。
一些提示:
- 你的作业说你应该 return 消息以及已发送消息的数量。为此使用 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;
}
}