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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:52:40