2012-02-21 16 views
2

新しいオブジェクトを作成し、古いオブジェクトからすべてのフィールドを新しいものにコピーし、新しいオブジェクトにコピーする必要があります。System.NullPointerException:nullオブジェクトの参照解除を試みる

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の関数呼び出しで例外が発生します。私が得る例外は、ヌルオブジェクトの逆参照を試みることです。フィールドのコピーは大きな機能です。私はわずか数行

+0

エラーが発生していますか?その行に参照解除はありません。デバッグ出力は何を表していますか? – mmix

+0

10:40:56.146(1146991000)| METHOD_ENTRY | [130] | 01pV00000004cUM | LQAgreementCloneCtrl.copyfields(LQ_Agreement__c、LQ_Agreement__c) 10:40:56.149(1149726000)| METHOD_EXIT | [130] | 01pV00000004cUM | LQAgreementCloneCtrl.copyfields(LQ_Agreement__c、10:40:56.150(1150241000)| FATAL_ERROR | System.NullPointerException:NULLオブジェクトの参照を解除しようとしています – user1048080

答えて

3

エラーが独自にcloneがそれを複製していない、それが唯一のSOQL結果から来ることができる、私の推測では、あなたのoclone.recordTypeサブオブジェクトが定義されていないということです、copyfield後でした。また、oclone.recordType.nameを割り当てることもできません。クローンにレコードタイプを割り当てるには、適切なRecordType Idをoclone.RecordTypeIdフィールドに割り当てる必要があります。

2

標準のSObject.clone(false、true)メソッドを使用するだけでは不十分であることはわかりません(偽 - Idを保持せずtrue - 参照だけでなく真のコピーを作る)。 SObjectsのリストは、独自のクローン/コピーロジックを作成するのではなく、同様にList.deepClone(false)で同様に本当にクローン化できます。

一般的に私はあなたのロジックをクリーンアップして、を参照してください。あなたのコードの流れをより明確に見てください。特に、変数にはどのような状態と値があるべきかという点で特に注意してください。あなたのコードからたとえば:

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

しかし、再び、次のように私には正しいようだ:

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

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を返され、意図していたようです

あなたが自分のクローンをロールすることを好むいくつかの他の理由が不足していない限り、

関連する問題