主类
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 以显示正确的索引?
答案 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
,并且可能在对 toModify
、ticketList
的调用中完全重建 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;
}