实现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
相关产品推荐
相关产品推荐

