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

独立方法填充数组后如何汇总数组对象数据及2D数组空指针异常解决

空指针异常原因

  • 循环边界错误:外层循环条件使用i <= invLiquor.length,该数组第一维长度为8,合法下标范围是0~7,当i=8时会触发数组越界,访问不存在的数组空间引发空指针。
  • 实例化顺序错误:内层循环中先调用invLiquor[i][j].setLiquorType(type)方法,后执行invLiquor[i][j] = new Liquor()实例化操作。二维数组初始化后所有元素默认值为null,未实例化就调用成员方法必然触发空指针。

修复后的数组初始化填充代码

final int LIQUORINV = 8;
final int EACHCOUNT = 10;
Liquor[][] invLiquor = new Liquor[LIQUORINV][EACHCOUNT];
// 修正循环条件为 < 而非 <=
for( int i=0; i < invLiquor.length; i++){
    System.out.println("\nWhich liquor are we counting?");
    String type = keyboard.next();
    for( int j=0; j < invLiquor[i].length; j++){
        // 先实例化对象,再调用set方法赋值
        invLiquor[i][j] = new Liquor();
        invLiquor[i][j].setLiquorType(type);
        System.out.println("What is the product name?: ");
        invLiquor[i][j].setLiquorName(keyboard.next());
        System.out.println("What is the count?: ");
        invLiquor[i][j].setLiquorCount(keyboard.nextDouble());
        System.out.println("What is the cost?: ");
        invLiquor[i][j].setLiquorCost(keyboard.nextDouble());
    }
}

独立方法填充+汇总实现

可以将填充逻辑封装为独立方法,调用完成后直接传入你已实现的汇总方法即可完成统计:

封装填充方法

// Scanner作为参数传入避免重复创建
public static Liquor[][] fillLiquorInventory(Scanner keyboard){
    final int LIQUORINV = 8;
    final int EACHCOUNT = 10;
    Liquor[][] invLiquor = new Liquor[LIQUORINV][EACHCOUNT];
    for( int i=0; i < invLiquor.length; i++){
        System.out.println("\nWhich liquor are we counting?");
        String type = keyboard.next();
        for( int j=0; j < invLiquor[i].length; j++){
            invLiquor[i][j] = new Liquor();
            invLiquor[i][j].setLiquorType(type);
            System.out.println("What is the product name?: ");
            invLiquor[i][j].setLiquorName(keyboard.next());
            System.out.println("What is the count?: ");
            invLiquor[i][j].setLiquorCount(keyboard.nextDouble());
            System.out.println("What is the cost?: ");
            invLiquor[i][j].setLiquorCost(keyboard.nextDouble());
        }
    }
    return invLiquor;
}

调用逻辑示例

// 初始化Scanner
Scanner keyboard = new Scanner(System.in);
// 调用独立方法完成数组填充
Liquor[][] inventory = fillLiquorInventory(keyboard);
// 调用已有的汇总方法得到总价值
double totalCost = GetLiquorCostTotal(inventory);
System.out.println("全部酒类库存总价值为:$" + totalCost);

你已实现的GetLiquorCostTotal逻辑无需修改,只要填充后的数组所有元素都完成实例化和赋值即可正常运行。

内容的提问来源于stack exchange,提问作者user17400890

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:27:03