简体   繁体   中英

Null pointer exception, taking data form lists and arrays

I've checked everything several time, can't get where I am wrong..

Main class:

    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 class works perfectly. I have created an object of ElectronicsEquipmentSupplier with a consideredRange of products. Also added customers to a customersList.

Here is ElectronicsEquipmentSupplier class:

    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);
    }
}

It shows that I've got NullPointerException at: if(productRange[i].getProductCode().equals(productCode))

and in the main class at:

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

Can't get why, as I have all required info..

Thank you!

Update 1:

Added this to the main method to solve first issue:

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

But now the ID of a customer cannot be found... That's the method in CustomerDetailsList class, which throws exception:

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);
} 

Update 2: updated .findCustomer() as SMA suggested

You are trying to initialize product in constructor like

productRange = new Product[range.length];

And then using it like:

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

Now you allocated space for your array but individual array elements ie products are not initialized and hence you get NullPointerException. To resolve the issue, you could do something like:

productRange[i] = new Product(..);//and then use it

最有可能是因为productRange [i]尚未初始化。

In your constructor you need to fully initialise the productRange array. Right now you are just creating an array of null references.

 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();
 }

The above solution build a new array which reference the same objects as the range array passed to the constructor.

You may just want to reference the array without any allocation, eg

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

Or do a deep copy of the range array, assuming you have either a Product#clone() method or a Product constructor that takes a Product parameter, eg

 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]);
     }
     //...
 }

The choice between these different methods depends on how the ElectronicsEquipmentSupplier class is used.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM