数组找重复元素Java代码报NullPointerException问题求助
数组中的重复元素问题与空指针异常排查
问题描述
给定一个含N个元素的数组,其中包含1到N-1的所有元素,且必有一个元素重复出现两次,需找出该重复元素。采用排序后比较相邻元素的方法实现Java代码后,运行时抛出异常:
Exception in thread "main" java.lang.NullPointerException
报错位置为Runner.takeInput(Runner.java:24)及Runner.main(Runner.java:55)。
原实现代码
import java.util.ArrayList; import java.util.*; public class Solution { public static int findDuplicate(ArrayList<Integer> arr) { // Write your code here. Collections.sort(arr); int i=0; for(i=0;i<arr.size()-1;i++){ if((arr.get(i))== (arr.get(i+1))) return arr.get(i); } return 0; } }
异常原因分析
- 传入的ArrayList为null:如果
Runner类中调用findDuplicate时传入了null,执行Collections.sort(arr)会直接触发空指针异常。 - ArrayList中存在null元素:虽然题目说明数组包含1到N-1的元素,但如果实际输入的列表中存在
null,调用arr.get(i)时会抛出空指针。 - 包装类比较隐患:使用
==比较Integer对象,对于大于127的数值,==会比较对象地址而非值,可能导致漏判重复元素(虽非当前空指针直接原因,但属于代码缺陷)。
修复方案
1. 添加非空校验
在方法开头添加输入合法性检查,提前拦截非法输入:
if (arr == null || arr.isEmpty()) { throw new IllegalArgumentException("输入数组不能为空"); }
2. 防御性处理元素null
遍历过程中先检查元素是否为null,再进行值比较:
Integer current = arr.get(i); Integer next = arr.get(i + 1); if (current != null && current.equals(next)) { return current; }
3. 替换==为equals
使用equals比较Integer值,避免包装类地址比较的问题。
优化后完整代码
import java.util.ArrayList; import java.util.Collections; public class Solution { public static int findDuplicate(ArrayList<Integer> arr) { // 拦截空输入 if (arr == null || arr.isEmpty()) { throw new IllegalArgumentException("输入数组不能为空"); } Collections.sort(arr); for (int i = 0; i < arr.size() - 1; i++) { Integer current = arr.get(i); Integer next = arr.get(i + 1); // 先判空再比较值 if (current != null && current.equals(next)) { return current; } } // 题目保证必有重复,此处为兜底异常 throw new IllegalStateException("未找到重复元素,不符合题目约束"); } }
额外提示
检查Runner类的takeInput方法(第24行),确认是否正确初始化ArrayList并填充元素,避免传入null或未填充的列表到findDuplicate方法中。
内容的提问来源于stack exchange,提问作者UTKARSH JOSHI
相关产品推荐
相关产品推荐

