gpt4 book ai didi

java - 如何修复此递归 StackOverFlowException 错误?

转载 作者:行者123 更新时间:2023-11-29 21:05:17 26 4
gpt4 key购买 nike

所以我有存储在 MySQL 数据库上的某种 friend 系统的数据,以及一种用于检索 Java 对象中的数据的 API。

Java 对象 (MPlayer) 包含用户名、在线状态、好友(ID 之间用“:”分隔)等内容。 MPlayer 对象将玩家的唯一 ID 作为构造函数。

数据在对象创建时和调用 reload() 方法时保存在对象中。这不是每次我想要获取用户名之类的内容时都访问数据库。这样做的原因是我需要循环获取数据以显示在GUI上,而且我显然不想每帧都下载数据。相反,我只是每 6 秒左右使用一次重新加载方法。

其中一个函数是 getFriends(),它返回 MPlayer 的列表。该列表是在创建 MPlayer 对象时存储的。问题是,当创建每个 MPlayer 好友时,它会为他们的好友创建一个列表,而好友又会为他们的好友创建一个列表,最终由于递归而出现 StackOverFlowException。

避免该错误的好解决方案是什么?

有问题的代码:

MPlayer 构造函数/加载方法:

public MPlayer(String player){
this.uuid = player;
try {
st.setString(1, uuid);
} catch (SQLException e) {

e.printStackTrace();
}
this.reload();
}

public void reload(){
try {
ResultSet set = st.executeQuery();
if(set.next()){
if(set.getString("server").equals("none")){
isConnected = false;
}else{
isConnected = true;
}
}
} catch (SQLException e) {

e.printStackTrace();
}

try {
ResultSet set = st.executeQuery();
if(set.next()){
this.serverIP = set.getString("server");
}
} catch (SQLException e) {

e.printStackTrace();
}



try {

ResultSet set = st.executeQuery();
if(set.next()){
this.username = set.getString("username");
}
} catch (SQLException e) {

e.printStackTrace();
}


try {
ResultSet get = st.executeQuery();
if(get.next()){
this.online = get.getBoolean("status");
}
} catch (SQLException e) {

e.printStackTrace();
}
try {


List<MPlayer> list = new ArrayList<MPlayer>();
ResultSet get = st.executeQuery();
if(get.next()){
for(String str : get.getString("friends").split(":")){
if(!str.equalsIgnoreCase("none")){
MPlayer player = new MPlayer(str);
if(player.isOnline()){
list.add(0,player);
}else{
list.add(player);
}
}
}

}
this.friends = list;
} catch (SQLException e) {

e.printStackTrace();
}


this.settings = new Settings(this);


PreparedStatement state = Main.getPreparedStatement("SELECT * FROM updates WHERE uuid=?");
try {
state.setString(1, this.getUUID());
ResultSet set2 = state.executeQuery();
List<StatusUpdate> updates = new ArrayList<StatusUpdate>();

while(set2.next()){
updates.add(new StatusUpdate(set2.getInt(1)));
}
Collections.sort(updates, new Comparator<StatusUpdate>() {
@Override
public int compare(StatusUpdate r1, StatusUpdate r2) {

return -1 * r1.getDate().compareTo(r2.getDate());
}
});

this.updates = updates;
} catch (SQLException e) {

e.printStackTrace();
}


List<StatusUpdate> updates = new ArrayList<StatusUpdate>();

for(MPlayer p : this.getFriends()){
updates.addAll(p.getStatusUpdates());

}
updates.addAll(this.getStatusUpdates());
Collections.sort(updates, new Comparator<StatusUpdate>() {
public int compare(StatusUpdate m1, StatusUpdate m2) {

return -1 * m1.getDate().compareTo(m2.getDate());
}
});
this.timeline = updates;



}

最佳答案

显而易见的答案是“停止递归执行而不终止”。

您不希望好友列表无限关闭 - 但您想要什么??只是好友列表吗?在这种情况下,也许您需要一个单独的对象类型,例如“FriendList”。在创建此内容时,您只需列出好友 ID;在专门访问好友记录之前不要加载好友记录。

另一种方法是对要激活的级别数进行编码,使其成为对象加载的参数。例如,加载深度为 N=2 的主 MPlayer。对于您主要的每个 friend ,加载深度为 N-1。当您点击 0 时,列出 ID,而不加载记录(如上)。

这会让您走向解决方案吗?

关于java - 如何修复此递归 StackOverFlowException 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36873373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com