使用类统计数组元素频率触发NullPointerException的原因及解决方法
问题分析与解决方案
错误原因
你创建的Count[] arr = new Count[101]只是初始化了一个能容纳101个Count对象的数组容器,但数组里的每一个位置默认都是null——并没有实际创建Count类的实例。当你输入元素后执行arr[value].count += 1时,arr[value]还是null,自然没法读取它的count字段,直接抛出了空指针异常。
解决方案
方案一:初始化数组时创建所有Count实例
在声明数组后,先遍历数组,给每个位置都创建一个Count对象,确保后续访问时不会出现null:
import java.util.*; public class Main { public static void main(String[] args) { Scanner lta = new Scanner(System.in); Count[] arr = new Count[101]; // 提前初始化数组中每个位置的Count实例 for (int i = 0; i < arr.length; i++) { arr[i] = new Count(); arr[i].value = i; // 可选:让value对应数组下标,和统计的元素值一致 } System.out.println("Enter the elements :"); for (int i = 0;i < 10;i++){ int value = lta.nextInt(); arr[value].count += 1; } System.out.println("Frequency of the elements in the array :"); for (int i = 1;i < arr.length;i++){ if (arr[i].count > 0){ System.out.println(i + " : " + arr[i].count); } } } static class Count{ long value; long count; } }
方案二:用HashMap统计(更灵活)
如果输入元素的范围不确定,用HashMap统计频率更合适,无需提前固定容器大小:
import java.util.*; public class Main { public static void main(String[] args) { Scanner lta = new Scanner(System.in); Map<Integer, Integer> frequencyMap = new HashMap<>(); System.out.println("Enter the elements :"); for (int i = 0; i < 10; i++) { int value = lta.nextInt(); // 存在则计数加1,不存在则初始化为1 frequencyMap.put(value, frequencyMap.getOrDefault(value, 0) + 1); } System.out.println("Frequency of the elements in the array :"); // 遍历输出结果,若需要按顺序输出可替换为TreeMap for (Map.Entry<Integer, Integer> entry : frequencyMap.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); } } }
内容的提问来源于stack exchange,提问作者Samik Pandit
相关产品推荐
相关产品推荐

