如何修复此索引越界错误

时间:2021-01-20 16:44:15

标签: java

主类

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

FileDealer 类(方法:修改)

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 以显示正确的索引?

3 个答案:

答案 0 :(得分:3)

可能 equals 类的 Ticket 方法以任何方式依赖于 mainID 字段,而且您似乎在 modify 方法中修改了该字段。< /p>

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

答案 1 :(得分:3)

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

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"); equals 在类 hashCode 中被覆盖,它们使用成员字段的值来定义相等性。

然后,方法 Ticket 更新列表中的现有值 modify,并且可能在对 toModifyticketList 的调用中完全重建 updateFile。< /p>

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

如果引用 indexOf 最初绑定到 t2 内的某个对象,则可以克服这个问题 -- 然后它在方法 ticketList 之外更新:

modify

答案 2 :(得分:1)

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

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