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

实现Distance类选择排序时出现NullPointerException的原因及修复方案

分析与修复你的空指针异常问题

首先,咱们来拆解这个错误:你看到的java.lang.NullPointerException是因为你的数组里有大量未初始化的null元素,当排序算法的findMax方法尝试对这些null对象调用compareTo方法时,直接触发了异常——毕竟null根本不是有效的Distance对象,没法调用任何实例方法。

为什么会出现null元素?

问题全在Driver05的input方法里,这里有两个致命的逻辑错误:

  • 循环逻辑完全错误:原循环for(int k = 1; k < numitems; k = k+2)的设计不符合需求。numitems是你要创建的Distance对象总数,每个对象需要读取两行数据(英尺+英寸),你应该循环numitems次来创建对应数量的对象,而不是跳步循环导致大部分数组位置空着。
  • 数组索引未递增:你初始化了x=0,但循环里从来没给x自增,导致一直往array[0]里重复赋值,其他数组位置全是默认的null。
  • 冗余重复操作:input方法内部还调用了sort和output,但你的main方法里也会执行这些操作,这会导致排序和输出被重复执行两次,完全没必要。

修复步骤

1. 修正input方法的核心逻辑

把input方法改成这样,确保每个数组位置都被正确初始化:

public static Comparable[] input(String filename) throws Exception {
    Scanner infile = new Scanner( new File(filename) );
    int numitems = infile.nextInt();
    Comparable[] array = new Distance[numitems];
    
    // 循环numitems次,为每个数组位置创建Distance对象
    for(int k = 0; k < numitems; k++) {
        int feetNum = infile.nextInt();
        int inchNum = infile.nextInt();
        array[k] = new Distance(feetNum, inchNum);
    }
    
    infile.close();
    // 移除这里的sort和output调用,交给main方法统一处理
    return array;
}

2. (可选)给排序方法增加空指针防护

虽然修复input后就不会有null了,但给findMax方法加个防护能让代码更健壮,避免未来不小心引入null元素:

private static int findMax(Comparable[] enterArray, int endIndex) {
    int max = 0;
    for(int x = 0; x < endIndex; x++) {
        // 跳过null元素,避免触发空指针
        if (enterArray[x] == null) continue;
        // 如果当前max位置是null,直接替换;否则正常比较大小
        if (enterArray[max] == null || enterArray[max].compareTo(enterArray[x]) < 0) {
            max = x;
        }
    }
    return max;
}

验证修复

改完之后,你的数组里就不会再有null元素了,选择排序就能正常调用compareTo方法比较Distance对象的大小,空指针异常也就消失了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:58:05