当我已经检查参数是否存在时,IndexOutOfBoundsEception?

时间:2015-07-27 19:27:42

标签: indexoutofboundsexception minecraft bukkit

我正在使用此代码获取IndexOutOfBoundsException,编码Minecraft Bukkit API:

if(args.length == 0){
        p.sendMessage(ChatColor.DARK_RED + "Wrong syntax. Correct syntax: /mi addpower <Name Identifier of Item> <Power> <EventType>");
        return;
    }

    String displayName = args[0];

    if(args.length == 1){
        p.sendMessage(ChatColor.DARK_RED + "Wrong syntax. Correct syntax: /mi addpower <Name Identifier of Item> <Power> <EventType>");
        return;
    }

    //Arg 2 is eventtype
    try {
        eventType = EventType.valueOf(args[1].toUpperCase());
    }catch(IllegalArgumentException e){
        p.sendMessage(ChatColor.RED + "Such an EventType does not exist!");
        return;
    }

    if(args.length == 2){
        p.sendMessage(ChatColor.DARK_RED + "Wrong syntax. Correct syntax: /mi addpower <Name Identifier of Item> <Power> <EventType>");
        return;
    }

    //Arg 2 is power
    Power power = getPower(args[2]);
    if (power == null) {
        p.sendMessage(ChatColor.RED + "That power does not exist!");
        return;
    }


    Vector<String> a = new Vector<String>(Arrays.asList(args));
    for(String string : a){
        p.sendMessage(string);
    }
    a.remove(0);
    a.remove(1);
    a.remove(2); //When I try to remove the second element it gives me the exception.
    args = a.toArray(new String[a.size()]);
    power.powerCommand(p, displayName, eventType, args);

我不明白为什么会发生这种情况?我检查参数是否存在,然后尝试删除它们,那么为什么会出现这个错误呢?

1 个答案:

答案 0 :(得分:0)

remove修改集合的计数,从而修改有效索引的范围。

如果args的长度为3,那么

Vector<String> a = new Vector<String>(Arrays.asList(args));

使用有效索引0,1和2创建长度为3的向量。

a.remove(0);

删除第一个元素,因此将计数更改为2。有效索引现在为0和1。

a.remove(1);

删除集合的第二个元素(注意这是args中的第三个元素而不是第二个元素)。 a的计数现在为1,因此0是唯一有效的索引。

a.remove(2);

因索引超出范围而抛出异常。

如果您想删除可以使用的前三个元素:

String first = a.remove(0);
String second = a.remove(0);
String third = a.remove(0);