适当处理 NullPointerException
Treat NullPointerException appropriately
我有一个 PurchaseOrderList class,它具有以下方法,return是列表中的一个对象数组。
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;
}
如果为空,则必须return为空!
我需要维护 2 个列表 - 一个用于当前,一个用于去年。如果是新的一年,则必须将当年的数据覆盖到lastYearList。并且必须清除当年的列表。同时,折扣基于客户在相关期间内所做的总订单价值,因此我需要从 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',代码会变得很长而且我必须输入很多相同的用于不同 try 和 catch 语句的东西。我相信有一个捷径可以做到这一点。
非常感谢!
使用这些中间数组有充分的理由吗?
如果可以在 PurchaseOrderList
class 中添加 getOrders()
方法,例如
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
...
我有一个 PurchaseOrderList class,它具有以下方法,return是列表中的一个对象数组。
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;
}
如果为空,则必须return为空!
我需要维护 2 个列表 - 一个用于当前,一个用于去年。如果是新的一年,则必须将当年的数据覆盖到lastYearList。并且必须清除当年的列表。同时,折扣基于客户在相关期间内所做的总订单价值,因此我需要从 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',代码会变得很长而且我必须输入很多相同的用于不同 try 和 catch 语句的东西。我相信有一个捷径可以做到这一点。
非常感谢!
使用这些中间数组有充分的理由吗?
如果可以在 PurchaseOrderList
class 中添加 getOrders()
方法,例如
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
...