队列/链接列表程序中的 NullPointerException


  1 // This program helps staff manage customers'
  2 // orders and decide who should be given a ready dish.
  3 
  4 import java.util.*;
  5 
  6 // This class represents all orders of customers
  7 class ListOrder {
  8 
  9     // Data member
 10     private int numDishes;
 11     // All dishes which the restaurant offers
 12     private String[] dishes;
 13     // Each dish has a queue of customers who ordered this dish
 14     // All such queues are put inside an ArrayList called dishQueues
 15     private ArrayList<Queue<Integer>> dishQueues;
 16 
 17     // Constructor
 18     public ListOrder(int numDishes, Scanner sc) {
 19         this.numDishes = numDishes;
 20         dishes = new String[this.numDishes];
 21         for(int i=0;i<this.numDishes;i++)   {
 22             dishes[i] = new String(sc.nextLine());
 23             dishQueues.add(new LinkedList<Integer>());
 24         }
 25     }
 26 
 27     // Add new order to the list
 28     public void addNewOrder(int dishID, int tag) {
 29         dishQueues.get(dishID-1).offer(new Integer(tag));
 30     }
 31 
 32     // Process food when it is ready
 33     // Return the customer who currently ordered for the dish
 34     // if there is no customer order for this dish return -1
 35     public int processReadyFood(int dishID) {
 36         int ready=0;
 37         if (dishQueues.get(dishID-1).peek() == null)
 38             return -1;
 39         else
 40             ready = dishQueues.get(dishID-1).poll();
 41 
 42         return ready;
 43     }
 44 
 45     // Get dish's name
 46     public String getDishName(int dishID) {
 47         return dishes[dishID-1];
 48     }
 49 
 50 }
 51 
 52 public class QuickEat {
 53 
 54     public static void main(String [] args) {
 55 
 56         Scanner sc = new Scanner(System.in);
 57         int numDishes = sc.nextInt();
 58         String command;
 59         sc.nextLine();
 60 
 61         // Create the list order of food
 62         ListOrder listOrder = new ListOrder(numDishes, sc);
 63 
 64         int noOfCommands = sc.nextInt();
 65         sc.nextLine();
 66 
 67         // Process commands
 68         for(int i=0; i<noOfCommands;i++)    {
 69             command = sc.next();
 70             if(command.equals("Order")) {
 71                 int tag = sc.nextInt();
 72                 int numOfDishes = sc.nextInt();
 73                 for(i=0;i<numOfDishes;i++)
 74                     listOrder.addNewOrder(sc.nextInt(),tag);
 75             }
 76             else if(command.equals("Ready"))    {
 77                 int dishID = sc.nextInt();
 78                 int customer = listOrder.processReadyFood(dishID);
 79                 if(customer == -1)
 80                     System.out.println("Throw away " + listOrder.getDishName(dishID));
 81                 else
 82                     System.out.println(listOrder.getDishName(dishID) + " ready to be served to Tag " + customer);
 83             }
 84         }
 85     }
 86 }

我对代码的其他部分没有太大问题,但如果有,请向我突出显示!我遇到的主要问题是,当我进入时

3
Fish n Chips

我不断收到此错误

Exception in thread "main" java.lang.NullPointerException
        at ListOrder.<init>(QuickEat.java:23)
        at QuickEat.main(QuickEat.java:62)

而且我似乎无法在任何地方发现错误。 有什么帮助吗? :/

编辑:感谢您的评论。我也遇到了另一个错误。我认为这与你们在初始化时所说的问题相同

当我进入时

3
Fish n Chips
Chicken Chop
Grilled Salmon
9
Order 1 2 1 3

我收到此错误。

Exception in thread "main" java.lang.NullPointerException
        at ListOrder.addNewOrder(QuickEat.java:30)
        at QuickEat.main(QuickEat.java:75)

救命!:(

private ArrayList<Queue<Integer>> dishQueues;

未实例化执行

private ArrayList<Queue<Integer>> dishQueues = new ArrayList<Queue<Integer>>();

在使用它之前。

甚至

private List<Queue<Integer>> dishQueues = new ArrayList<Queue<Integer>>();

您从未初始化过菜队列数组列表。在构造函数中初始化它。

dishQueues = new ArrayList<Queue<Integer>>();

相关内容

  • 没有找到相关文章