如何避免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;
关键修正点解释
- 数组满的判断:
counter记录的是已添加CD的数量,当它等于数组长度时,说明数组已经没有空位了,直接提示即可。 - 重复ID检查:
- 遍历范围限定在
0到counter-1,只检查已经添加的CD,后面的数组元素都是null,不用管 - 因为只遍历已添加的元素,所以这些元素肯定不是
null,不会触发空指针
- 遍历范围限定在
- 逻辑顺序:先检查数组是否满,再检查ID重复,最后添加CD,逻辑清晰,不会出现混乱的状态。
额外优化建议
- 输入问题:
scanner.next()会在遇到空格时停止读取,如果你输入的艺术家或专辑名包含空格(比如Taylor Swift),会导致读取错误,建议改用scanner.nextLine(),但要注意nextInt()之后会留下换行符,需要先清空:choice = scanner.nextInt(); scanner.nextLine(); // 清空nextInt()留下的换行符,避免后续nextLine()读取空内容 - 变量命名:Java规范里变量名应该用小驼峰,比如
CDid改成cdId,CDgenre改成cdGenre,这样代码更易读。
内容的提问来源于stack exchange,提问作者slahslah90
相关产品推荐
相关产品推荐

