使用高停止条件 10000 时如何修复 StackOverflowError

How to fix StackOverflowError when using a high stopping condition 10000

我正在尝试解决以下问题:

给定一个 Player class - 一个可以与其他 Player 通信的实例。

要求如下:

  1. 创建 2 个玩家实例
  2. 其中一个玩家应该向第二个玩家发送消息(我们称这个玩家为“发起者”)
  3. 当玩家收到一条消息时,它应该回复一条消息,该消息包含收到的消息以及一个计数器的值,该计数器保存该玩家已发送的消息数。
  4. 两个玩家应该运行在同一个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 个阈值。

一些提示:

  1. 你的作业说你应该 return 消息以及已发送消息的数量。为此使用 int。
  2. 您需要一个单独的方法来接收消息。
  3. 作业不需要您实际存储消息。

一个最小的解决方案可能是这样的:

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;
    }
}