繁体   English   中英

如何修复此索引超出范围错误

[英]How do I fix this index out of bound error

主Class

        FileDealer.modify(t2, 0, "99999");
        FileDealer.modify(t2, 0, "88888");

FileDealer Class(方法:修改)

public static void modify(Ticket t, int type, String newInformation) throws MacAddressLengthException, IOException {
        int index = ticketList.indexOf(t);
        Ticket toModify = null;
        toModify = ticketList.get(index);
        switch (type) {
        case 0: // adding mainID
            toModify.setMainID(Utility.convertInt(newInformation));
            break;
        case 1: // adding assetID
            toModify.setAssetID(Utility.convertInt(newInformation));
            break;
        case 2: // adding macAdd
            toModify.setMacAdd(newInformation);
            break;
        case 3: // edit
            toModify.setNote(newInformation);
            break;
        case 4: // delete
            ticketList.remove(index);
        }
        updateFile();
        readFile();
    }

当第一次调用 modify 方法时,它可以编辑工单详细信息,但是当第二次调用时,该方法中的int index = ticketList.indexOf(t)返回“-1”,即使没有任何更改,它给了我一个索引超出范围的例外。 如何更改 -1 以显示正确的索引?

可能Ticket class 的equals方法取决于mainID字段的任何方式,并且您似乎在modify方法中修改了该字段。

因此,第二次调用modify时, indexOf返回-1 ,因为equals的计算结果为false

如果t2不在ticketList中,则会出现此问题 - 因此有两个equal的对象:一个是t2 ,另一个在ticketList中:

static List<Ticket> ticketList = Arrays.asList(
    new Ticket(1, 1, "one", "one"), 
    new Ticket(2, 2, "two", "two"), 
    new Ticket(3, 3, "drei", "drei")
);
// ...
Ticket t2 = new Ticket(2, 2, "two", "two");

modify(t2, 0, "99999");
modify(t2, 0, "88888");

最有可能的是,方法equalshashCode在 class Ticket中被覆盖,它们使用成员字段的值来定义相等性。

然后,方法modify更新列表中的现有值toModify ,并且可能在对updateFilereadFile的调用中完全重建了ticketList

因此, t2变得过时了,因为ticketList不再包含具有旧mainID的票证并且indexOf返回 -1。

如果引用t2最初绑定到 ticketList 中的某个ticketList ,则可以克服这一问题——然后它会在方法modify外部更新:

Ticket t2 = ticketList.get(1);
modify(t2, 0, "99999");
modify(t2, 0, "88888");

您需要检查索引是否等于 -1,然后打印一条明确的消息并跳过该过程,因为票不存在。 如果没有匹配,则 indexOf 返回 -1,因此您可以在以下情况下添加:

if(index < 0){
 System.out.print("ticket not exists!");
 break;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM