库存添加物品功能报错求助:代码逻辑问题排查
我帮你梳理下这个additem方法里的几个关键问题,这些都是导致它没法正常工作的核心原因:
Object类型无法直接调用物品专属方法
你传入的newItem是Object类型,而Java的Object类根本没有getItemNum()方法,直接调用这段代码连编译都通不过,更别说运行了。你需要先把它转换成你实际的物品类(比如假设你的物品类叫Item),转换前最好先做类型校验,避免出现类型转换异常。循环逻辑完全错误
现在的逻辑是:只要循环里碰到一个和新物品不匹配的元素,就直接把新物品加到库存末尾,然后itemsInInventory自增。这会导致两个严重问题:一是如果库存里已经有相同物品,但不是第一个元素,程序根本不会检查到,直接就新增了一条重复记录;二是itemsInInventory在循环中变化,会导致后续迭代的范围混乱,甚至触发数组越界。
正确的逻辑应该是:先遍历所有已有的库存物品,找有没有相同编号的,如果找到就叠加数量;如果遍历完所有物品都没找到匹配项,再考虑添加新物品到库存末尾。没有处理库存已满的情况
你的库存数组长度是10,但代码里完全没检查当前库存数量itemsInInventory是不是已经达到上限了。直接往invent[itemsInInventory]赋值的话,当库存满了就会抛出ArrayIndexOutOfBoundsException异常。冗余的条件判断
前面已经判断了itemsInInventory == 0,后面的else if (itemsInInventory > 0)完全可以换成else,逻辑上是等价的,没必要多写这个多余的判断。
修复后的代码示例
public void addItem(Object newItem) { // 先校验传入的是否是有效物品实例 if (!(newItem instanceof Item)) { System.out.println("无法添加:传入的不是有效物品"); return; } Item newItemObj = (Item) newItem; // 检查库存是否已满,提前拦截错误 if (itemsInInventory >= invent.length) { System.out.println("无法添加:库存已满"); return; } // 库存为空时直接添加 if (itemsInInventory == 0) { invent[0] = newItemObj; inventItemAmount[0] = 1; itemsInInventory++; return; } // 遍历已有库存,查找相同编号的物品 boolean foundSameItem = false; for (int i = 0; i < itemsInInventory; i++) { Item existingItem = (Item) invent[i]; if (existingItem.getItemNum() == newItemObj.getItemNum()) { // 找到相同物品,增加数量 inventItemAmount[i]++; foundSameItem = true; break; // 找到后直接退出循环,不用继续遍历 } } // 没找到相同物品,添加新物品到库存末尾 if (!foundSameItem) { invent[itemsInInventory] = newItemObj; inventItemAmount[itemsInInventory] = 1; itemsInInventory++; } }
修复要点说明
- 类型安全处理:增加了
instanceof校验和强制类型转换,确保调用getItemNum()方法的是正确的物品实例; - 库存上限校验:提前检查库存是否已满,避免数组越界异常;
- 修正循环逻辑:先完整遍历找相同物品,找不到再新增,避免重复添加和逻辑混乱;
- 逻辑简化:用布尔变量标记是否找到相同物品,代码可读性更强;
- 直观的数量初始化:直接将新物品的数量设为1,比自增0更清晰(如果数组初始值是0的话自增也可,但设1更明确)。
内容的提问来源于stack exchange,提问作者Brandon Finley

