为何给Query类变量赋值时会触发NullPointerException?
空指针异常原因及解决方法
你遇到的NullPointerException核心原因是:Java中创建对象数组时,仅初始化了数组容器,数组内的每个元素默认都是null,没有实际生成Query类的实例。不管是直接给属性赋值,还是调用setQuery方法,都需要先让q[i]指向一个新的Query对象,否则操作的是null引用,必然触发空指针异常。
第一种实现的修正代码
class Query{ int ind, L, R, LB; } public void solveQueries(int[] nums, int[][] Queries) // 修正参数类型:原int nums改为int[] nums { int m = Queries.length; Query[] q = new Query[m]; int sz = (int)Math.sqrt(nums.length); for(int i=0; i<m; i++){ q[i] = new Query(); // 关键:先实例化Query对象 q[i].ind = i; q[i].L = Queries[i][0]; q[i].R = Queries[i][1]; q[i].LB = Queries[i][0]/sz; System.out.println(q[i].ind + " " + q[i].L +" "+q[i].R+" "+q[i].LB); } }
注:原代码中solveQueries的参数int nums是错误的,无法调用nums.length,这里一并修正为int[] nums。
第二种实现的修正代码
class Query{ public int ind, L, R, LB; public void setQuery(int ind, int L ,int R, int LB){ this.L = L; this.R = R; this.ind = ind; this.LB = LB; } }; public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = 5; int m = 3; int sz = (int)Math.sqrt(n); int[] arr = new int[n]; Query[] q = new Query[m]; // 读取数组输入 for(int i=0; i<n; i++){ arr[i] = sc.nextInt(); } // 读取查询并初始化Query对象 for(int i=0; i<m; i++){ int L = sc.nextInt(); int R = sc.nextInt(); q[i] = new Query(); // 关键:先实例化Query对象 q[i].setQuery(i, L, R, L/sz); } }
总结
Java中对象数组的初始化仅分配数组的内存空间,数组内的每个元素需要单独通过new 类名()创建实例,之后才能对其属性或方法进行操作。
内容的提问来源于stack exchange,提问作者Arya
相关产品推荐
相关产品推荐

