我想使用命令'/ sb toggle'在bukkit中切换记分板。但是我似乎无法使其工作,因为编译器不断循环遍历代码。因此,如果我从ArrayList中删除一个键,编译器将继续执行它不是我想要的。
srvyr
所以问题是它一直告诉我记分板已打开。真正应该在每次执行命令时在开和关之间切换的时间。
答案 0 :(得分:1)
调用此方法时,其中的每一行将一一运行。
看看第一行,
ArrayList<UUID> toggle = new ArrayList<>();
每次运行该方法时,都会创建一个新的空 ArrayList
并将其分配给toggle
。除了变量的范围之外,这是问题的根源。
一旦到达if
语句,
if (toggle.contains(p.getUniqueId()))
toggle
仍将引用刚刚分配给它的空ArrayList
。它不包含任何内容,因此肯定不会包含p.getUniqueId()
。
此处的解决方法是为toggle
提供比该方法更大的范围,而不是每次该方法运行时都重新分配它。可能看起来像这样:
public class MyClass{
private ArrayList<UUID> toggle = new ArrayList<>();
public void toggleScoreboard(Player p){
if (toggle.contains(p.getUniqueId()))
// Rest of your code here
}
}
然后,每次方法运行时,它都引用相同的ArrayList
,它将保留存储在其中的值。