
该程序因未初始化对象数组中的元素即直接访问其字段,导致nullpointerexception;核心问题在于声明了count类型数组但未实例化各数组项,需在使用前完成对象创建。
该程序因未初始化对象数组中的元素即直接访问其字段,导致nullpointerexception;核心问题在于声明了count类型数组但未实例化各数组项,需在使用前完成对象创建。
在Java中,声明一个引用类型数组(如 Count[] arr = new Count[101];)仅分配了101个null引用的空间,并未自动为每个索引位置创建Count对象实例。因此,当代码执行 arr[value].count += 1; 时,若 arr[value] 仍为 null,JVM将抛出 NullPointerException: Cannot read field "count" because "arr[value]" is null —— 这正是错误的根本原因。
此外,原逻辑还存在边界不一致问题:
- 输入循环仅读取10个整数(i
- 若用户输入超出 [0, 100] 范围的值(如负数或 ≥101),还会触发 ArrayIndexOutOfBoundsException。
✅ 正确做法是:
- 显式初始化每个用到的数组元素(在读取前或读取时);
- 统一输入/输出范围,避免越界;
- 增强健壮性:对非法输入做校验(可选)。
以下是修复后的完整代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner lta = new Scanner(System.in);
Count[] arr = new Count[101]; // 索引范围:0~100
// 初始化所有可能用到的位置(0~100)
for (int i = 0; i = 0 && value 0) {
System.out.println(i + " : " + arr[i].count);
}
}
}
static class Count {
long value; // 当前未使用,可省略或用于存储原始值
long count = 0; // 显式初始化为0,更安全
}
}
? 关键修复点说明:
- ✅ for 循环显式调用 new Count() 初始化全部101个数组槽位;
- ✅ count 字段在类中初始化为 0,避免未赋值带来的不确定性;
- ✅ 输入校验确保 value 在合法索引范围内,防止越界;
- ✅ 输出循环与数组长度一致(i
⚠️ 注意事项:
- 若业务场景中元素范围极大(如 [-10^9, 10^9]),不宜使用固定长度数组,应改用 HashMap
实现稀疏频次统计; - 使用对象数组统计频次适用于值域小且连续的场景(如计数排序、桶统计),兼具高效与直观优势;
- 始终牢记:Java中new T[n] ≠ n个T实例,而是n个null引用——这是新手高频踩坑点。
通过以上修正,程序即可稳定运行,准确输出各元素出现频次,彻底规避空指针异常。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











