System.NullPointerException: попытка отменить ссылку на нулевой объект - PullRequest
2 голосов
/ 21 февраля 2012

Мне нужно создать новый объект и скопировать все поля из старого в новый, и это дочерний элемент для возможности.

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.Исключение, которое я получаю, это попытка де-ссылки на пустой объектКопирование полей - это большая функция.Я просто дал несколько строк

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Ошибка после copyfield, я предполагаю, что ваш подобъект oclone.recordType не определен, clone сам по себе не реплицирует его, он может быть получен только из результата SOQL. Также вы не можете назначить oclone.recordType.name, чтобы назначить тип записи клону, вы должны назначить правильный RecordType Id для поля oclone.RecordTypeId.

2 голосов
/ 22 февраля 2012

Не уверен, почему простого использования стандартного метода SObject.clone (false, true) будет недостаточно (false - не сохранять Id и true - сделать истинную копию, а не просто ссылку). Список объектов SObject также можно действительно клонировать с помощью List.deepClone (false) вместо создания собственной логики клонирования / копирования.

В общем, я бы подумал о том, чтобы очистить вашу логику, чтобы вы могли увидеть поток вашего кода более четко, особенно с точки зрения того, какое состояние и значения должны иметь ваши переменные. Например из вашего кода:

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 = copyfields(lqaclone, lqa);
lqaclone.Opportunity__c = oclone.Id;

Но опять же мне кажется правильным следующее:

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

если я не пропущу какую-то другую причину, по которой вы предпочли бросить свой собственный клон.

...