You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:22:39