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

数组找重复元素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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:32:25