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

如何避免NullPointerException并确保新增CD的ID在数组中唯一

解决你的CD管理程序添加功能问题

我看你卡了两天的代码,核心问题出在重复ID检查逻辑完全错误、数组满的判断逻辑混乱,还有没处理好空指针的隐患,下面一步步给你修正:

先说说你当前代码的致命问题

  • 重复ID检查完全搞错了:你写的CDid.equalsIgnoreCase(CDid.getCdId())是把字符串CDid当成对象调用方法,这根本不符合逻辑——你应该遍历数组里已经添加的CD对象,对比它们的ID和新输入的ID才对。
  • 数组满的判断逻辑混乱:你现在的else分支直接把counter设为数组长度-1,这会导致后续添加完全乱套,正确的做法是先判断数组是否还有空位,再检查ID重复。
  • 空指针隐患:数组初始化后元素都是null,如果直接遍历整个数组调用getCdId(),必然触发NullPointerException,必须只遍历已经添加过CD的位置。

修正后的case 1代码

case 1:
    System.out.println("请输入CD信息(ID 流派 艺术家 专辑 存储位置 曲目数 存储量 价格):");
    // 注意:如果输入包含空格(比如艺术家名带空格),后续可以改成nextLine(),这里先保持你的输入逻辑
    CDid = scanner.next();
    CDgenre = scanner.next();
    CDartist = scanner.next();
    CDalbum = scanner.next();
    CDstorageSpot= scanner.next();
    CDtrackAmount= scanner.next();
    CDstorageAmount = scanner.next();
    CDprice = scanner.next();
    CD cd_obj = new CD(CDid, CDgenre, CDartist, CDalbum, CDstorageSpot, CDtrackAmount, CDstorageAmount, CDprice);

    // 1. 先检查数组是否已满
    if (counter >= cdArray.length) {
        System.out.println("The array is full");
        break;
    }

    // 2. 检查ID是否重复(只遍历已添加的CD,避免空指针)
    boolean idExists = false;
    for (int i = 0; i < counter; i++) {
        CD existingCd = cdArray[i];
        if (existingCd.getCdId().equalsIgnoreCase(CDid)) {
            idExists = true;
            break;
        }
    }

    // 3. 根据检查结果处理
    if (idExists) {
        System.out.println("CD with ID " + CDid + " already exists!");
    } else {
        cdArray[counter] = cd_obj;
        counter++;
        System.out.println("CD added successfully!");
    }
    break;

关键修正点解释

  1. 数组满的判断:counter记录的是已添加CD的数量,当它等于数组长度时,说明数组已经没有空位了,直接提示即可。
  2. 重复ID检查:
    • 遍历范围限定在0到counter-1,只检查已经添加的CD,后面的数组元素都是null,不用管
    • 因为只遍历已添加的元素,所以这些元素肯定不是null,不会触发空指针
  3. 逻辑顺序:先检查数组是否满,再检查ID重复,最后添加CD,逻辑清晰,不会出现混乱的状态。

额外优化建议

  • 输入问题:scanner.next()会在遇到空格时停止读取,如果你输入的艺术家或专辑名包含空格(比如Taylor Swift),会导致读取错误,建议改用scanner.nextLine(),但要注意nextInt()之后会留下换行符,需要先清空:
    choice = scanner.nextInt();
    scanner.nextLine(); // 清空nextInt()留下的换行符,避免后续nextLine()读取空内容
    
  • 变量命名:Java规范里变量名应该用小驼峰,比如CDid改成cdId,CDgenre改成cdGenre,这样代码更易读。

内容的提问来源于stack exchange,提问作者slahslah90

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:49:31