不使用ArrayList实现数组删除元素,不存在的ID也提示删除成功如何解决
问题根因分析
- 未判断目标ID是否真实存在于数组成员中:当前代码无论是否找到匹配ID,都会直接创建长度为
原数组长度-1的新数组,即便没有命中要删除的ID,返回的数组也会比原数组长度少1位,最后一位未赋值为null,调用方无法根据返回结果判断是否真的执行了删除,就会出现无论传什么ID都提示删除成功的问题。 - 未处理边界异常:如果原数组成员为空时调用方法,会直接抛出
NegativeArraySizeException数组长度为负的异常;如果数组成员的ID存在null值,调用equals方法对比时会触发空指针异常。
修复方案(纯数组实现,未使用ArrayList)
public Members[] deleteMembers(String id) { // 入参或原数组为空直接返回原数组 if (id == null || member == null || member.length == 0) { return member; } // 先统计匹配到的目标ID数量,同时规避空指针风险 int matchCount = 0; for (Members m : member) { if (id.equals(m.getId())) { matchCount++; } } // 没有匹配到目标ID,直接返回原数组,调用方可通过返回值与原数组是否相等判断删除结果 if (matchCount == 0) { return member; } // 按实际要删除的数量创建新数组 Members[] copyId = new Members[member.length - matchCount]; for (int i = 0, k = 0; i < member.length; i++) { // 用入参id调用equals,避免成员id为null时空指针 if (id.equals(member[i].getId())) { continue; } copyId[k++] = member[i]; } return copyId; }
调用侧判断逻辑参考
在调用deleteMembers方法的位置,通过判断返回数组和原数组是否为同一个对象,即可确认是否真的执行了删除:
Members[] newMembers = deleteMembers(inputId); if (newMembers == member) { System.out.println("输入的ID不存在,删除失败"); } else { member = newMembers; System.out.println("ID删除成功"); }
内容的提问来源于stack exchange,提问作者kitsune
相关产品推荐
相关产品推荐

