Salesforce System.NullPointerException:尝试反引用null对象

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

我必须创建一个新对象,并将所有字段从旧对象复制到新对象,这是opportunity的子对象

copyfields是一种将字段从一个对象复制到另一个对象的方法,而cloning方法中的函数调用行就是我获取异常的行

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);