独立方法填充数组后如何汇总数组对象数据及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
相关产品推荐
相关产品推荐

