Я проверил все несколько раз, не могу понять, где я ошибаюсь.
Основной класс:
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
Вы пытаетесь инициализировать продукт в конструкторе, например
productRange = new Product[range.length];
И затем используя его, как:
if(productRange[i].getProductCode().equals(productCode))
Теперь вы выделили место для своего массива, но отдельные элементы массива, т.е. продукты не инициализированы, и, следовательно, вы получаете исключение NullPointerException. Чтобы решить проблему, вы можете сделать что-то вроде:
productRange[i] = new Product(..);//and then use it
Скорее всего, потому, что productRange [i] не был инициализирован.
В вашем конструкторе вам нужно полностью инициализировать массив 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
.
productRange[i]
будет нулевым. Вы не можете вызватьgetProductCode()
с ним.