Java点餐程序出现NullPointerException问题求助:无法调用Array.getFoodName()因为food_arr2[i]为null
修复点餐程序的空指针异常问题
嘿,我来帮你搞定这个问题!你的程序抛出NullPointerException是因为每次循环都重新创建了一个新数组,导致之前添加的食物数据丢失,数组里存在null元素,遍历的时候调用getFoodName()就会出错。下面我一步步给你解释问题和修复方案:
问题根源分析
在你的while循环里,每次都会执行food_arr = new Array[k];——这会创建一个全新的数组,新数组的所有元素默认都是null。举个例子:
- 第一次循环k=1:创建长度1的数组,你给
food_arr[0]赋值了汉堡,没问题; - 第二次循环k=2:创建长度2的新数组,此时这个数组的
food_arr[0]和food_arr[1]都是null,你只给food_arr[1]赋值了披萨,food_arr[0]还是null; - 最后遍历数组时,访问到
null元素的getFoodName(),自然就抛出空指针异常了。
另外,你的输出逻辑也不符合预期,现在的代码会每次循环都打印"You ordered:",而不是最后一次性输出所有食物。
修复后的代码
我推荐用ArrayList来存储订单,它支持动态添加元素,不用手动管理数组长度,更适合这种场景:
import java.util.ArrayList; import java.util.Scanner; public class Food { // 把数组换成ArrayList来存储订单 private ArrayList<Array> foodList = new ArrayList<>(); public ArrayList<Array> getFoodList() { return foodList; } public void addFood(Array food) { foodList.add(food); } public static void main(String[] args) { Scanner s = new Scanner(System.in); Food food = new Food(); boolean stop = false; while (!stop) { System.out.print("Buy food: "); String foodName = s.next(); // 直接把新食物添加到ArrayList里 food.addFood(new Array(foodName)); System.out.print("Order again(Y/N)? "); String decide = s.next(); if (decide.equalsIgnoreCase("n")) { stop = true; } // 不需要维护k和j变量了,ArrayList会自动处理长度 } // 按照预期格式输出订单 System.out.print("You ordered: "); for (Array item : food.getFoodList()) { System.out.print(item.getFoodName() + " "); } s.close(); } } // 假设你的Array类是这样的(确保它有getFoodName方法) class Array { private String foodName; public Array(String foodName) { this.foodName = foodName; } public String getFoodName() { return foodName; } }
关键修改点
- 用
ArrayList<Array>替代固定长度的数组:动态添加元素,避免手动管理数组长度和元素复制的问题; - 新增
addFood方法来添加订单,替代原来的setFoodArray,逻辑更清晰; - 输出逻辑调整:最后一次性打印所有食物,完全符合你期望的输出格式;
- 去掉了多余的
k和j变量,代码更简洁易读。
如果坚持用数组的话(不推荐)
如果你一定要用数组实现,那每次创建新数组时需要把旧数组的元素复制过去,修改循环里的逻辑:
// 初始化数组 Array[] food_arr = new Array[0]; int count = 0; while(!stop) { System.out.print("Buy food: "); String foodName = s.next(); // 创建新数组,长度比旧数组+1 Array[] newArr = new Array[food_arr.length + 1]; // 复制旧数组的元素到新数组 System.arraycopy(food_arr, 0, newArr, 0, food_arr.length); // 添加新元素 newArr[count] = new Array(foodName); food_arr = newArr; count++; // 后续的询问逻辑不变... }
不过这种方式不如ArrayList简洁高效,所以还是推荐用集合类。
内容的提问来源于stack exchange,提问作者hedgeCoder
相关产品推荐
相关产品推荐

