使用递归方法时出现 StackOverflowError。我正在 Spigot API 之上进行构建。
这是我的方法:
private Location spawnPlayer(Player p) {
int r = new Random().nextInt(ServerManager.getInstance().getServer(p).getSpawns().size());
final Spawn s = ServerManager.getInstance().getServer(p).getSpawns().get(r);
if (s.hasPlayer()) {
spawnPlayer(p);
} else {
s.setPlayer(p);
Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(Arsenal.p, new Runnable() {
public void run() {
spawnClear--;
if (spawnClear == 0) {
s.setPlayer(null);
}
}
}, 0L, 20L);
}
return s.getLocation();
}
我在 spawnPlayer(p)
处收到错误,如果生成点已经有玩家,它会调用自身。
最佳答案
看起来 s.hasPlayer()
始终为 true,因此:
if(s.hasPlayer()){
spawnPlayer(p);
}
在 spawnPlayer(Player)
方法内部执行,这会导致该方法无限运行,从而导致 StackOverflowError
.
要解决此问题,您可以在调用 spawnPlayer(p)
之前等待:
if(s.hasPlayer()){
long timeToWait = 20L;//set the time to wait to 20 ticks (1 second)
Bukkit.getServer().getScheduler().runTaskLater(Arsenal.p, new Runnable(){
public void run(){
spawnPlayer(p);
}
},timeToWait);
}
那么,您的代码可能如下所示:
private Location spawnPlayer(Player p) {
int r = new Random().nextInt(ServerManager.getInstance().getServer(p).getSpawns().size());
final Spawn s = ServerManager.getInstance().getServer(p).getSpawns().get(r);
if(s.hasPlayer()){
long timeToWait = 20L;//set the time to wait to 20 ticks (1 second)
Bukkit.getServer().getScheduler().runTaskLater(Arsenal.p, new Runnable(){
public void run(){
spawnPlayer(p);
}
},timeToWait);
}
else{
s.setPlayer(p);
Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(Arsenal.p, new Runnable() {
public void run() {
spawnClear--;
if (spawnClear == 0) {
s.setPlayer(null);
}
}
}, 0L, 20L);
}
return s.getLocation();
}
另一个修复方法是使 s.hasPlayer()
并不总是正确,例如,通过使用 ArrayList
确保玩家尚未生成:
List<String> spawned = new ArrayList<String>();
private Location spawnPlayer(Player p){
int r = new Random().nextInt(ServerManager.getInstance().getServer(p).getSpawns().size());
final Spawn s = ServerManager.getInstance().getServer(p).getSpawns().get(r);
if(s.hasPlayer() && !spawned.contains(p.getName()){
spawned.add(p.getName());
spawnPlayer(p);
}
else{
//the rest of your code...
}
}
关于java - 递归方法上的 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28797398/