我编写了此类,我从触发器调用该类,以防止用户为同一机会选择多个机会产品,但这给了我这个错误: System.NullPointerException:尝试取消引用空对象 我似乎无法找到解决方法。
这是我的代码:
public class AP03_OpportunityLineItem {
public static void preventmultipleOpportunityLineItems(List<OpportunityLineItem> listOppLineItems){
Set<Id>opportunityIds = new Set<Id>();
List<OpportunityLineItem> listOfOpportunityLineItems = new List <OpportunityLineItem>();
// get all parent IDs
for(OpportunityLineItem oli : listOfOpportunityLineItems)
{
opportunityIds.add(oli.OpportunityId);
}
// query for related Opportunity Line Items
Map<Id, Opportunity> mapOpportunities = new Map<Id, Opportunity>([SELECT ID,
(SELECT ID
FROM OpportunityLineItems)
FROM Opportunity
WHERE ID IN :opportunityIds]);
for(OpportunityLineItem olitems : listOppLineItems)
{
if(mapOpportunities.get(olitems.OpportunityId).OpportunityLineItems.size()>0)
{
olitems.addError('Ce client ne peut plus loué des véhicules');
}
}
}
}
谢谢。
答案 0 :(得分:0)
第4行对于您的实际需求没有意义,第4行和第6行是导致您错误决定进而导致错误代码的罪魁祸首。下面是修改后的代码版本,可以正常使用。
public class AP03_OpportunityLineItem {
public static void preventmultipleOpportunityLineItems(List<OpportunityLineItem> listOppLineItems){
Set<Id>opportunityIds = new Set<Id>();
//List<OpportunityLineItem> listOfOpportunityLineItems = new List <OpportunityLineItem>(); //NOT REQUIRED
// get all parent IDs
for(OpportunityLineItem oli : listOppLineItems) // YOU HAVE TO USE listOppLineItems INSTEAD OF listOfOpportunityLineItems
{
opportunityIds.add(oli.OpportunityId);
}
// query for related Opportunity Line Items
Map<Id, Opportunity> mapOpportunities = new Map<Id, Opportunity>([SELECT ID,
(SELECT ID
FROM OpportunityLineItems)
FROM Opportunity
WHERE ID IN :opportunityIds]);
for(OpportunityLineItem olitems : listOppLineItems)
{
if(mapOpportunities.get(olitems.OpportunityId).OpportunityLineItems.size()>0)
{
olitems.addError('Ce client ne peut plus loué des véhicules');
}
}
}
}
关于您的NullPointerException
,以上代码(尽管您的代码错误,但您的代码也是如此)将不会获得此异常,除非您通过传递null作为参数/参数来调用此方法。因此,在调用此方法之前,必须验证您没有传递null作为参数,或者可以在此方法的第二个if
循环之前包含for
语句(检查null)。