有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何修复使用高停止条件时的StackOverflowerError

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

给定一个玩家类-一个可以与其他玩家通信的实例

要求如下:

  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次迭代时,我在下一行代码中收到一个StackOverflow错误:if(receiver.getSentMessagesList().size()<10000) {当我使用较低的数字(如10或100)时,代码工作正常,但当我使用10000次迭代时,代码崩溃。我如何修复此问题而不再收到此错误


共 (1) 个答案

  1. # 1 楼答案

    当您在此处发送消息时,您将调用接收方的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;
        }
    }