Java中按ID从对象数组移除Book对象的实现报错问题
Java库存管理程序代码问题排查与修复方案
直接触发编译/运行错误的硬伤
- 语法错误:代码中
inventory[i].getId是非法写法。getId()是Book类的实例方法,必须补充方法调用括号修正为inventory[i].getId(),否则无法通过编译。 - 无效逻辑:
(inventory[size] - inventory[i]);没有任何实际作用。Java对象数组不支持直接通过减法完成元素移除,两个Book类型对象做减法会直接触发编译报错,完全达不到删除元素的目的。 - 未初始化的数组:
inventory仅做了属性声明,从未分配内存空间,只要执行读写数组的操作,就会直接触发空指针异常。
现有业务逻辑的缺陷
- 遍历范围错误:removeBook方法循环遍历的范围是
inventory.length(数组总容量),但实际有效存储的书籍数量由size变量记录,数组尾部的大量空值位置属于无效遍历。 - 缺失核心移除流程:静态数组删除元素的标准实现逻辑为:定位到目标元素下标后,将该下标后续的所有元素依次向前移动一位覆盖目标位置,再将有效存储计数
size减1,最后把数组尾部的重复引用位置置空。现有代码完全没有实现这段流程。 - addBook方法的连锁问题:
- 输入读取异常:调用
scan.nextInt()读取书籍ID后,输入缓冲区会残留换行符,后续直接调用scan.nextLine()读取书名时会直接捕获空字符串,无法获取用户实际输入的书名。 - 查重逻辑空指针风险:现有查重逻辑遍历整个数组长度,未被赋值的数组位置为null,对null对象调用
.equals()会直接触发空指针异常;且查重仅打印提示信息,没有中断新增流程,重复ID的书籍依然会被存入数组,没有起到拦截作用。
- 输入读取异常:调用
修正后的核心代码参考
重写后的removeBook方法
public void removeBook() { System.out.print("Enter the book id of the book you want to remove: "); int id = scan.nextInt(); boolean removeFlag = false; // 仅遍历有效存储的书籍范围 for (int i = 0; i < size; i++) { if (id == inventory[i].getId()) { // 将目标位置后的所有元素向前移位,覆盖待删除元素 for (int j = i; j < size - 1; j++) { inventory[j] = inventory[j + 1]; } // 有效存储数减1,清空尾部的重复引用 size--; inventory[size] = null; removeFlag = true; break; } } if (!removeFlag) { System.out.println("未查询到ID为" + id + "的书籍"); } }
同步需要补充的基础修正
- 在Inventory类的构造方法中初始化inventory数组,例如设置初始容量为100:
inventory = new Book[100]; - 读取完int/double类型输入(ID、价格)后,调用一次
scan.nextLine()吃掉缓冲区残留的换行符,再读取字符串类型的书名。 - 查重逻辑补充空判断:仅对非空的数组元素校验ID重复,发现重复时直接中断新增流程,不再执行后续的存书操作。
内容的提问来源于stack exchange,提问作者CB89
相关产品推荐
相关产品推荐

