【问题标题】:Array.length & ArrayIndexOutOfBoundsExceptionArray.length & ArrayIndexOutOfBoundsException
【发布时间】:2015-11-16 03:35:39
【问题描述】:

我排除了与问题无关的大部分代码。下面是 Bukkit 插件的代码——下面的所有内容都已定义。但是,当代码尝试通过第二个 if 语句(我尝试比较长度)时,它会抛出 ArrayIndexOutOfBoundsException

我已经比较了exempt.length0 并打印了结果,得到了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] - 这永远不会有效。
  • exempt[exempt.length] 按定义会失败。数组的索引编号为0length-1,所以length 太大了。 --- 与其他一些语言不同,Java 数组不能调整大小,因此它不会通过使用该结构而增长。要获得可调整大小的数组,请使用ArrayList

标签: java indexoutofboundsexception minecraft bukkit


【解决方案1】:

您无法访问exempt[exempt.length].

因为索引从 0 分配到 exclude.length-1。

更重要的是,该行也应该在“if (exempt.length > 0)”块内,因为当数组为空时它也会给出异常。因为exempt.length == 0,但是exempt.length == -1

感谢艾默特的建议。

【讨论】:

  • 该行也应该在 "if (exempt.length > 0)" 块内,因为当数组为空时它也会给出异常。
  • @Aimert 好的,我理解我的错误,部分原因是你们俩。当我将其定义为public Player[] exempt = new Player[100];,例如 100 时,它会变为 NullPointerException。
  • 表示100个元素。不会有索引为 100 的元素。
  • 因为你已经分配了内存空间,但是没有填写它指向的对象的地址。因此,这会导致 NullPointerException。请将每个元素初始化为新玩家或指向某个已经存在的玩家。
  • 你从哪里得到 NullPointerException?
【解决方案2】:

所以我没有使用数组,而是按照建议使用列表。

List<Player> exempt = new ArrayList<Player>;

在更正了所有代码(将其从 Array 更新为 ArrayList 方法等)之后,它就像一个魅力。

【讨论】:

    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2016-05-01
    • 2012-08-18
    相关资源
    最近更新 更多