Salesforce System.NullPointerException:尝试反引用null对象
我必须创建一个新对象,并将所有字段从旧对象复制到新对象,这是opportunity的子对象 copyfields是一种将字段从一个对象复制到另一个对象的方法,而cloning方法中的函数调用行就是我获取异常的行Salesforce System.NullPointerException:尝试反引用null对象,salesforce,apex-code,Salesforce,Apex Code,我必须创建一个新对象,并将所有字段从旧对象复制到新对象,这是opportunity的子对象 copyfields是一种将字段从一个对象复制到另一个对象的方法,而cloning方法中的函数调用行就是我获取异常的行 public LQAgreementCloneCtrl(ApexPages.StandardController controller) { lqa = [Select off1stdate__c, hosp1stdate__c, Zip_Code_New__c, X66_Con
public LQAgreementCloneCtrl(ApexPages.StandardController controller) {
lqa = [Select off1stdate__c, hosp1stdate__c, Zip_Code_New__c, X66_Contract__c,WAWF__c,,AccountRevenue__c
From LQ_Agreement__c Where id=:ApexPages.currentPage().getParameters().get('id')];
o = [Select of_Hospitals__c, X8_Gal__c, X4_Gal__c, X3mo_Avg_LBS_stop__c, X3_Gal__c,
X2_Gal__c, X1st_Pick_Up_Date__c, X17_Gal__c, X12_month_Actual_Stops__c,
X12_mo_Avg_Rev__c, Waste_Destruction_Date__c, WS_Other__c, Vision_Match__c,
Value_analysis_committee__c, AR_FuelFee__c, AR_FixerFee__c, AR_EnergyFee__c, APPROVALS__c,RecordType.Name
From Opportunity WHERE Id=:lqa.Opportunity__c];
}
public PageReference cloning(){
if(lqa.Status__c=='Deal Approved'){
//oclone=o;
//oclone.id=null;
oclone=o.clone();
insert oclone;
System.debug('Oclone>>>>>>>'+oclone);
LQ_Agreement__c lqaclone=new LQ_agreement__c();
//lqaclone=new LQ_Agreement__c();
lqaclone.Opportunity__c=oclone.Id;
System.debug('LQAClone>>>>>'+lqaclone);
lqaclone=copyfields(lqaclone,lqa);
oclone.Name=o.Name+'-Amended';
//Checking the Record type of the original Opportunity to create the new cloned Opp with RecordType of same waste stream + amendment added
if(o.RecordType.Name=='LQ Bio/SMS Renewal'|| o.RecordType.Name=='LQ Bio/SMS New Business' )
oclone.RecordType.Name='LQ BIO/SMS Amendment';
if(o.RecordType.Name=='LQ Haz Waste New Business'|| o.RecordType.Name=='LQ Haz Waste Renewal' )
oclone.RecordType.Name='LQ Haz Waste Amendment';
if(o.RecordType.Name=='LQ RMW New Business'|| o.RecordType.Name=='LQ RMW Renewal' )
oclone.RecordType.Name='LQ RMW Amendment';
if(o.RecordType.Name=='LQ Rx/Pharma New Business'|| o.RecordType.Name=='LQ Rx/Pharma Renewal' )
oclone.RecordType.Name='LQ Rx/Pharma Amendment';
//Checking the Record type of the original LQ Agreement to create the new cloned LQA with RecordType + amendment added
if(lqa.RecordType.Name=='LQ Existing Agreement' || lqa.RecordType.Name=='LQ New Agreement' )
lqaclone.RecordType.Name='LQ New Agreement – Amendment';
if(lqa.RecordType.Name=='LQ Existing Agreement GPO' || lqa.RecordType.Name=='LQ New Agreement GPO' )
lqaclone.RecordType.Name='LQ New Agreement GPO – Amendment';
insert lqaclone;
update oclone;
p=new ApexPages.StandardController(lqaclone).view();
}
else{
System.debug('Inside Else statement');
p=new ApexPages.StandardController(lqa).view();
}
return p;
}
public LQ_Agreement__c copyfields(LQ_Agreement__c lqaclone1,LQ_Agreement__c lqa1){
lqaclone1.Approved_By_RSD__c=lqa1.Approved_By_RSD__c;
lqaclone1.ApprovedByBrent__c=lqa1.ApprovedByBrent__c;
lqaclone1.ApprovedByJIM__c=lqa1.ApprovedByJIM__c;
lqaclone1.ApprovedByVP__c=lqa1.ApprovedByVP__c;
}
我在copyfields的函数调用中遇到异常。我得到的异常是尝试取消引用null对象。复制字段是一个很大的功能。我只给出了几行错误是在copyfield之后,我猜您的oclone.recordType子对象没有定义,克隆本身不会复制它,它只能来自SOQL结果。此外,您不能分配oclone.recordType.name,要将记录类型分配给克隆,您必须为oclone.RecordTypeId字段分配适当的recordType Id。不确定为什么仅使用标准的SObject.clonefalse、true方法不足以实现false-不保留Id和true-创建一个真正的副本,而不仅仅是一个引用。类似地,可以使用list.deepClonefalse来真正克隆Sobject列表,而不是手工制作自己的克隆/复制逻辑 一般来说,我会考虑清理你的逻辑,这样你就能更清楚地看到你的代码流程,尤其是你的变量应该有什么样的状态和值。例如,从您的代码:
LQ_Agreement__c lqaclone=new LQ_agreement__c();
//lqaclone=new LQ_Agreement__c();
lqaclone.Opportunity__c=oclone.Id;
System.debug('LQAClone>>>>>'+lqaclone);
lqaclone=copyfields(lqaclone,lqa);
假设copyfields返回了一个新的SObject,那么似乎有以下意图:
但同样,我认为以下几点似乎是正确的:
LQ_Agreement__c lqaclone = lqa.clone(false, true);
除非我遗漏了一些其他原因,您更愿意滚动您自己的克隆。您确定错误就发生在这里吗?在那条线上没有解引用。调试输出说什么?10:40:56.146 1146991000 |方法|[130]| 01pV00000004cUM | LQAgreementCloneCtrl.copyfieldsLQ |协议| c,LQ |协议| c,LQ |协议| 10:40:56.149 1149726000 |方法|[130]| 01pV00000004cUM | LQAgreementCloneCtrl copyfieldsLQ |协议|,LQ_协议_uuC 10:40:56.150 1150241000 |致命错误| System.NullPointerException:尝试取消引用空对象
LQ_Agreement__c lqaclone = lqa.clone(false, true);