You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 09:24:03