通过类查找数组中元素的频率可能导致 NULL 指针异常的问题是什么?

What may be the problem for finding frequency of elements in array through class leading to NULL Pointer Exception?

提问人:Samik Pandit 提问时间:3/9/2023 更新时间:3/9/2023 访问量:47

问:

此代码查找数组中元素的频率。但它显示无法读取字段,因为数组为 null。

法典

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner lta = new Scanner(System.in);
        Count[] arr = new Count[101];
        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.print(i + " : " + arr[i].count);
                System.out.println();
            }
        }
    }
    static class Count{
        long value;
        long count;
    }
}


错误

Exception in thread "main" java.lang.NullPointerException: Cannot read field "count" because "arr[value]" is null

是否有任何解决方案可以让该程序运行而不会出现任何错误,或者 JAVA 程序终止的原因是什么。

Java Arrays NullPointerException 频率

评论


答:

1赞 John Williams 3/9/2023 #1

您只填充了前 10 个元素,但读取了前 101 个元素。arr.length 为 101,因为 arr = new Count[101]。

与写入循环一样,读取循环需要在 i < 10 处停止

1赞 tbatch 3/9/2023 #2

arr[i].count正在尝试访问在数组索引处的对象中调用的字段。您已经初始化了数组,但它是空的。您可以通过简单打印 来检查这一点,这将返回 null。countiarray[0]

若要解决此问题,请在尝试访问数组之前初始化数组的元素。

for (int i = 0 ; i < 10 ; i++){
  int value = lta.nextInt();
  arr[value] = new Count();
  arr[value].count += 1;
}

但请注意,这将中断下一个循环。这是因为您只初始化数组中的 10 个索引,但尝试访问所有 102 个索引。

通常,初始化一个大于所需值的数组是一种糟糕的编程实践。如果您计划只允许输入 10 个值,则将数组初始化为 10。然后在两个循环中使用数组的长度。