适当地处理NullPointerException

时间:2015-03-26 18:03:49

标签: java exception

我有一个带有以下方法的PurchaseOrderList类,它返回列表中的一个对象数组。

public PurchaseOrder [] getAllOrders()
{   
    PurchaseOrder [] ordersArray = new PurchaseOrder[listOfOrders.size()];

    if (listOfOrders.isEmpty())
        ordersArray = null;
    else
        for(int i = 0; i < listOfOrders.size(); i++)
        {
            ordersArray[i] = listOfOrders.get(i);
        }

    return ordersArray;
}

如果为空,则必须返回null!

我需要保留2个列表 - 一个用于当前,一个用于去年。如果是新年,则必须将当前年份的数据覆盖到lastYearList。并且必须清除当前年份的清单。同时,折扣基于客户在相关期间内所做的totalOrdersValue,因此我需要从pastYearList中减去每个客户的过去订单的价值,然后才会受到限制。

我有以下内容,但不知道如何优化它..

public void startNewMonth()
{
    PurchaseOrder [] lastYearArray = lastYearList.getAllOrders();
    PurchaseOrder [] currentYearArray = currentYearList.getAllOrders(); 

    try
    {
        if(lastYearList != null)
        {
            for(int i = 0; i < lastYearArray.length; i++)
            {
                String foundID = lastYearArray[i].getCustomersID();
                int valueOfOrder = lastYearArray[i].getFullPriceValue();

                customersList.findCustomer(foundID).
                                      updateTotalOrdersValue(-valueOfOrder);
            }
        }

        System.arraycopy(currentYearArray, 0, lastYearArray, 0,
                                                   currentYearArray.length);            

        for(int i = 0; i < lastYearArray.length; i++)
        {
            lastYearList.addPurchaseOrder(lastYearArray[i]);
        }

        currentYearList.setListToEmpty();
    }

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

似乎从第一行抛出NullPointerException(如果没有数据),但如果我把它放入'try',代码会变得非常冗长,我必须为不同的尝试键入很多相同的东西以及catch语句。我相信有一个简短的方法可以做到这一点。

非常感谢!

1 个答案:

答案 0 :(得分:1)

是否有充分理由拥有这些中间阵列?

如果您可以向getOrders()类添加PurchaseOrderList方法,例如

List<PurchaseOrder> getOrders() { retur listOfOrders; }

然后您可以简化startNewMonth()

public void startNewMonth() {
    if(lastYearList != null)
    {
        for(PurchaseOrder po : lastYearList.getOrders()) {
            String foundID = po.getCustomerID();
            int valueOfOrder = po.getFullPriceValue();
            customersList.findCustomer(foundID).updateTotalOrdersValue(-valueOfOrder);
        }

        for (PurchaseOrder po : currentYearList.getOrders()) {
            lastYearList.addPurchaseOrder(po);
        }

        currentYearList.setListToEmpty();
    }
}

请注意,您的方法的逻辑气味:名称为startNewMonth,您管理yearList ...