Array.length & ArrayIndexOutOfBoundsException
Array.length & ArrayIndexOutOfBoundsException
我排除了大部分与问题无关的代码。下面是 Bukkit 插件的代码——下面的所有内容都已定义。但是,当代码尝试通过第二个 if 语句(我尝试比较长度的地方)时,它会抛出 ArrayIndexOutOfBoundsException
.
我比较了 exempt.length
和 0
并打印了结果,结果是 true
,所以我不确定为什么比较会产生错误。
public Player[] exempt = { }; // If exempt is defined as a new Player[100], it will result in NullPointerException.
if (args[0].equalsIgnoreCase("toggle")) {
boolean isExempt = false;
if (exempt.length > 0) {
for (Player player : exempt) {
if (player.getName().equals(commandSender.getName())) {
isExempt = true;
}
}
}
if (!isExempt) {
exempt[exempt.length] = (Player) commandSender; // ArrayIndexOutOfBoundsException
}
commandSender.sendMessage(ChatColor.GREEN + "Toggled receiving AdminChat to " + (!isExempt ? "true" : "false") + ".");
return true;
}
您无法访问 exempt[exempt.length].
因为索引是从 0 到 exempt.length-1 分配的。
此外,该行也应该在 "if (exempt.length > 0)" 块内,因为当数组为空时它也会给出异常。因为 exempt.length == 0,但是 exempt.length == -1
感谢 Aimert 的建议。
所以我没有使用数组,而是按照建议使用了列表。
List<Player> exempt = new ArrayList<Player>;
并且在更正所有代码后(将其从 Array 更新为 ArrayList 方法等),效果非常好。
我排除了大部分与问题无关的代码。下面是 Bukkit 插件的代码——下面的所有内容都已定义。但是,当代码尝试通过第二个 if 语句(我尝试比较长度的地方)时,它会抛出 ArrayIndexOutOfBoundsException
.
我比较了 exempt.length
和 0
并打印了结果,结果是 true
,所以我不确定为什么比较会产生错误。
public Player[] exempt = { }; // If exempt is defined as a new Player[100], it will result in NullPointerException.
if (args[0].equalsIgnoreCase("toggle")) {
boolean isExempt = false;
if (exempt.length > 0) {
for (Player player : exempt) {
if (player.getName().equals(commandSender.getName())) {
isExempt = true;
}
}
}
if (!isExempt) {
exempt[exempt.length] = (Player) commandSender; // ArrayIndexOutOfBoundsException
}
commandSender.sendMessage(ChatColor.GREEN + "Toggled receiving AdminChat to " + (!isExempt ? "true" : "false") + ".");
return true;
}
您无法访问 exempt[exempt.length].
因为索引是从 0 到 exempt.length-1 分配的。
此外,该行也应该在 "if (exempt.length > 0)" 块内,因为当数组为空时它也会给出异常。因为 exempt.length == 0,但是 exempt.length == -1
感谢 Aimert 的建议。
所以我没有使用数组,而是按照建议使用了列表。
List<Player> exempt = new ArrayList<Player>;
并且在更正所有代码后(将其从 Array 更新为 ArrayList 方法等),效果非常好。