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

标签 java stack-overflow

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

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

要求如下:

  1. 创建 2 个 Player 实例
  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 次迭代时,我在以下代码行中收到 StackOverflow 错误:if(receiver.getSentMessagesList().size()<10000) {当我使用较小的数字(例如 10 或 100)时,代码工作正常,但是当我使用 10000 时,代码会崩溃。如何修复此问题并且不再收到此错误?

最佳答案

当您在此处发送消息时,您将调用接收者的 sendMessage 方法。这将调用发送者的方法。然后再次接收器。依此类推,直到您在处理一条消息时达到 10000 阈值。

一些提示:

  1. 您的作业要求您应返回消息以及已发送消息的数量。为此使用 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;
    }
}

关于java - 使用高停止条件 10000 时如何修复 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68711775/

相关文章:

java - 解码 LinkedList 实现

c# - 基于 XML 的验证框架跨语言

java - Jenkins:\Java\jdk1.8.0_172\jre\bin""这时候没想到

php - 需要防止 PHP 正则表达式段错误

string - t和*t的区别

fortran - 当 Fortran 生成大型内部临时数组时,如何避免堆栈溢出?

python - python可以抛出 "stack overflow"错误吗?

java - 如何在 Linux 上配置 VSCode 使其在不同的项目中为 Gradle 应用不同的 JAVA_HOME?

java - 是否可以在 libGDX 中仅通过平移和旋转创建一个简单的动画?

java - 从 Java 访问 Salesforce Apex Soap Web 服务