System.NullPointerException:尝试取消引用null对象

时间:2012-02-21 17:10:42

标签: salesforce apex-code

我必须创建一个新对象,并将旧对象的所有字段复制到一个新对象中,这对于机会来说是个孩子。

copyfields是一个将字段从一个对象复制到另一个对象的方法,而克隆方法中的函数调用行是我得到异常的行。

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对象。复制字段是一个很大的功能。我刚刚给了几行

2 个答案:

答案 0 :(得分:3)

错误发生在copyfield之后,我的猜测是你的oclone.recordType子对象没有被定义,clone本身没有复制它,它只能来自SOQL结果。此外,您无法指定oclone.recordType.name,以指定要克隆的记录类型,您必须将正确的RecordType Id分配给oclone.RecordTypeId字段。

答案 1 :(得分:2)

不确定为什么只使用标准的SObject.clone(false,true)方法是不够的(假 - 不保留Id和true - 制作一个真正的副本,而不仅仅是一个引用)。同样可以使用List.deepClone(false)真正克隆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返回 new SObject,似乎有以下内容:

LQ_Agreement__c lqaclone = copyfields(lqaclone, lqa);
lqaclone.Opportunity__c = oclone.Id;

但同样,以下似乎对我来说是正确的:

LQ_Agreement__c lqaclone = lqa.clone(false, true);

除非我错过了你喜欢推出自己的克隆的其他原因。

相关问题