Исключение нулевого указателя, принимая списки данных и массивы

1

Я проверил все несколько раз, не могу понять, где я ошибаюсь.

Основной класс:

    try
    {
        File productData = new File("productData.txt");
        Product [] consideredRange = InputFileData
                                          .readProductDataFile(productData);

        ElectronicsEquipmentSupplier management = 
                   new ElectronicsEquipmentSupplier(1, 12, consideredRange);  


        File customerData = new File("CustomerData.txt");
        Scanner fileScan = new Scanner(customerData);

        while(fileScan.hasNext())
            management.addNewCustomer(InputFileData.
                                                readCustomerData(fileScan));       

        management.addNewPurchaseOrder("21/01/12", "PSC-1235", "kD/9767", 50);            

    }
    catch(Exception e)
    {
        System.out.println(e);
        e.printStackTrace();
    }   

Класс InputFileData работает отлично. Я создал объект ElectronicsEquipmentSupplier с рассмотренным Range продуктов. Также добавлены клиенты в список клиентов.

Вот класс ElectronicsEquipmentSupplier:

    public class ElectronicsEquipmentSupplier 
    {
         private int currentMonth;
         private int currentYear;
         private Product [] productRange;
         private CustomerDetailsList customersList;
         private PurchaseOrderList currentYearList;
         private PurchaseOrderList lastYearList;


    public ElectronicsEquipmentSupplier(int currentMonth, int currentYear, Product [] range)
    {
         this.currentMonth = currentMonth;
         this.currentYear = currentYear;
         productRange = new Product[range.length];
         customersList = new CustomerDetailsList();
         currentYearList = new PurchaseOrderList();
         lastYearList = new PurchaseOrderList();
    }

    public void addNewPurchaseOrder(String dateStr, String customerID, 
         String productCode, int qty) throws IncorrectPurchaseOrderException
    {
    // check for positive order quantity
    if(qty < 1)
        throw new IncorrectPurchaseOrderException("Order quantity must be"
                                                            + " positive!");

    // check for the product code in given range and get that product 
    Product foundProduct = null;

    for(int i = 0; i < productRange.length; i++)
    {   
        if(productRange[i].getProductCode().equals(productCode))
        {   
            foundProduct = productRange[i];
            break;
        }
    }
    if(foundProduct == null)
        throw new IncorrectPurchaseOrderException("Product code is not in"
                                                   + " the product range!");
    try
    {   
        // creating OrderDate object and getting appropriate discount
        OrderDate newDate = new OrderDate(dateStr);
        int discount = customersList.findCustomer(customerID).
                                                          getDiscountRate();

        // creating purchase order and adding it to a list
        PurchaseOrder givenOrder = new PurchaseOrder(newDate, customerID, 
                                               foundProduct, qty, discount);

        currentYearList.addPurchaseOrder(givenOrder);

        // updating the record of purchasing customer
        int priceValue = givenOrder.getFullPriceValue();
        customersList.findCustomer(customerID)
                                        .updateTotalOrdersValue(priceValue);
    }
    catch(Exception e)
    {   
        throw new IncorrectPurchaseOrderException("The problem is with: "
                                                                + "\n" + e);
    }
}

Он показывает, что у меня есть NullPointerException: if(productRange[i].getProductCode().equals(productCode))

и в основном классе по адресу:

management.addNewPurchaseOrder("21/01/12", "PSC-1235", "kD/9767", 50);

Не могу понять, почему, поскольку у меня есть вся необходимая информация..

Спасибо!

Обновление 1:

Добавлено это к основному методу решения первой проблемы:

            for(int i = 0; i < consideredRange.length; i++)
            management.getProductRange()[i] = consideredRange[i];

Но теперь идентификатор клиента не может быть найден... Что метод в классе CustomerDetailsList, который выдает исключение:

public CustomerDetails findCustomer(String givenID)
                                            throws CustomerNotFoundException
{   
    int i = 0;
    boolean match = false;

    while(!match && i < listOfCustomerDetails.size())
    {
        match = listOfCustomerDetails.get(i).getCustomerID()
                                                           .equals(givenID); 
        i++;
    }

    if(!match)
        throw new CustomerNotFoundException("The provided ID has not been"
                                                                + " found");
    else
        return listOfCustomerDetails.get(i);
} 

Обновление 2: обновленный.findCustomer(), как предлагалось SMA

  • 0
    Похоже, productRange[i] будет нулевым. Вы не можете вызвать getProductCode() с ним.
  • 0
    Почему? Я думаю, что я инициализировал массив ассортимента продукции конструктором, не так ли?
Показать ещё 8 комментариев
Теги:

3 ответа

2
Лучший ответ

Вы пытаетесь инициализировать продукт в конструкторе, например

productRange = new Product[range.length];

И затем используя его, как:

if(productRange[i].getProductCode().equals(productCode))

Теперь вы выделили место для своего массива, но отдельные элементы массива, т.е. продукты не инициализированы, и, следовательно, вы получаете исключение NullPointerException. Чтобы решить проблему, вы можете сделать что-то вроде:

productRange[i] = new Product(..);//and then use it
  • 0
    Спасибо! Но теперь у меня есть еще одна проблема: int discount = CustomersList.findCustomer (customerID). getDiscountRate ();
  • 0
    Он генерирует исключение curtomerNotFoundException, что означает, что существует проблема со списком клиентов ... Есть идеи?
Показать ещё 6 комментариев
1

Скорее всего, потому, что productRange [i] не был инициализирован.

1

В вашем конструкторе вам нужно полностью инициализировать массив productRange. Прямо сейчас вы просто создаете массив null ссылок.

 public ElectronicsEquipmentSupplier(int currentMonth, 
                                     int currentYear, 
                                     Product [] range) {
     this.currentMonth = currentMonth;
     this.currentYear = currentYear;
     productRange = new Product[range.length];
     for (int i = 0; i < productRange.length; i++) {
        productRange[i] = range[i];
     }
     customersList = new CustomerDetailsList();
     currentYearList = new PurchaseOrderList();
     lastYearList = new PurchaseOrderList();
 }

Вышеупомянутое решение построит новый массив, который ссылается на те же объекты, что и range массивов, переданный конструктору.

Вы можете просто ссылаться на массив без какого-либо выделения, например

 public ElectronicsEquipmentSupplier(int currentMonth, 
                                     int currentYear, 
                                     Product [] range) {
     //...
     productRange = range;
     //...
 }

Или сделайте глубокую копию массива range, если у вас есть либо метод Product#clone() либо конструктор Product который принимает параметр Product, например

 public ElectronicsEquipmentSupplier(int currentMonth, 
                                     int currentYear, 
                                     Product [] range) {
     //...
     productRange = new Product[range.length];
     for (int i = 0; i < productRange.length; i++) {
        productRange[i] = new Product(range[i]);
     }
     //...
 }

Выбор между этими различными способами зависит от того, как используется класс ElectronicsEquipmentSupplier.

  • 0
    спасибо большое, разобрали! Но получил еще одну проблему (см. Обновление) ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню