在 Java 中使用 scheduleAtFixedRate 遍历列表
Iterate through list using scheduleAtFixedRate in Java
我正在尝试根据用户可以设置的计时器遍历列表。但是我在 TimerTask
runnable 中找不到一个好的方法。
可以在我下面分享的代码中找到总体思路。 Announcements
是 List<String>
的 List
。在每个时间间隔,我都想从 announcements
中获取下一个 announcement
并显示其中的字符串。除了计时器超过多个 announcements
:
之外,我已经完成了所有工作
timer.scheduleAtFixedRate(new TimerTask() {
int iterator = 0;
@Override
public void run() {
List<String> announcement = announcements.get(iterator);
for (String line : announcement) {
Bukkit.broadcastMessage(line);
}
iterator++;
if(iterator > announcements.size()){
iterator = 0;
}
}
}, 0, (int)config.get("interval")*1000);
使用我发布的代码,我得到一个 IndexOutOfBoundsException
,它甚至从未发布任何消息。如果我删除迭代器代码,它将无休止地显示第一个 announcement
。
您的以下条件有误:
if(iterator > announcements.size())
在这种情况下,超出了列表的大小,因此抛出 IndexOutOfBoundsException
。但是条件应该检查 iterator
大于或 等于 列表的大小:
if(iterator >= announcements.size())
我正在尝试根据用户可以设置的计时器遍历列表。但是我在 TimerTask
runnable 中找不到一个好的方法。
可以在我下面分享的代码中找到总体思路。 Announcements
是 List<String>
的 List
。在每个时间间隔,我都想从 announcements
中获取下一个 announcement
并显示其中的字符串。除了计时器超过多个 announcements
:
timer.scheduleAtFixedRate(new TimerTask() {
int iterator = 0;
@Override
public void run() {
List<String> announcement = announcements.get(iterator);
for (String line : announcement) {
Bukkit.broadcastMessage(line);
}
iterator++;
if(iterator > announcements.size()){
iterator = 0;
}
}
}, 0, (int)config.get("interval")*1000);
使用我发布的代码,我得到一个 IndexOutOfBoundsException
,它甚至从未发布任何消息。如果我删除迭代器代码,它将无休止地显示第一个 announcement
。
您的以下条件有误:
if(iterator > announcements.size())
在这种情况下,超出了列表的大小,因此抛出 IndexOutOfBoundsException
。但是条件应该检查 iterator
大于或 等于 列表的大小:
if(iterator >= announcements.size())