function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Maria22Maria22 

FATAL_ERROR System.NullPointerException: Attempt to de-reference a null object Apex Triggers

Hi All,

I have written a trigger on Order object which will take the status of Order Start Date field from Order and copy the same on "Upgrade Order Date" field in accounts.

I am receiving System.NullPointerException and I am not able to find out where I am making mistakes or what I have done wrong.

Below is my trigger:
trigger OrderTrigger on Order (after insert) {
                
    OrderTriggerHandler orderhandler= new OrderTriggerHandler(trigger.new);
    
     if(trigger.isAfter && trigger.isInsert) {  
         orderhandler.HandleAfterInsert();
     }
    
}

Below is my trigger Handler:
 
public class OrderTriggerHandler {
   List<Order>newOrders;
 
    public OrderTriggerHandler(List<Order>newOrders){
        this.newOrders=newOrders;
        
    }
    
    public void HandleAfterInsert(){ 
       updateOrderUpgradeStatus();
    }
    
    
    public void updateOrderUpgradeStatus(){
        
         Map<ID, Account> parentAccts = new Map<ID, Account>(); //Making it a map instead of list for easier lookup
          //List<Id> listIds = new List<Id>();
            Set<Id> setIds=new Set<Id>();
        
            for (Order childObj : newOrders) {
            setIds.add(childObj.Name);
          }
        
            system.debug('The value is: ' + parentAccts);
            //parentAccts = new Map<Id, Account>([Select id,Name,Upgrade_Order_Date__c,(Select id,EffectiveDate,Name,Header_Id__c from Orders where RecordType.name = 'Upgrade Order' ORDER BY Header_Id__c DESC) from Account WHERE  ID IN :setIds AND RecordType.name = 'Recipient']);
          parentAccts = new Map<Id, Account>([Select id,Name,Upgrade_Order_Date__c,(Select id,Name,EffectiveDate,Header_Id__c,Status from Orders where RecordType.name = 'Upgrade Order' ORDER BY Header_Id__c DESC NULLS LAST) from Account WHERE  ID IN :setIds AND RecordType.name = 'Recipient' ]);
          for (Order order: newOrders){
              
            // if(Order.Type=='Upgrade Order'){
              
             Account myParentAcct = parentAccts.get(order.Name);
               system.debug('The value is: ' + myParentAcct);    
             myParentAcct.Upgrade_Order_Date__c= order.EffectiveDate;
              //order.EffectiveDate=myParentAcct.Upgrade_Order_Date__c;
             
              //}
          }
        system.debug('The value is: ' + parentAccts);
   		 update parentAccts.values();
         
            }
     
        
    }

I ran the query in workbench and getting few records as well but in debug logs "parentAccts" doesn'r returning any row and line
system.debug('The value is: ' + myParentAcct);

retuen null and  myParentAcct.Upgrade_Order_Date__c= order.EffectiveDate shows the attempt to de-reference a null object.

Kindly help/guide/suggests.
Any help will be greatly apprecaited

Many thanks in advance

Thanks & Regards,
Harjeet
Steven NsubugaSteven Nsubuga
I think you entered the wrong field in setIds, and therefore are not returning any records in parentAccts.
Try this
public class OrderTriggerHandler {
   List<Order>newOrders;
 
    public OrderTriggerHandler(List<Order>newOrders){
        this.newOrders=newOrders;
        
    }
    
    public void HandleAfterInsert(){ 
       updateOrderUpgradeStatus();
    }
    
    
    public void updateOrderUpgradeStatus(){
        
         Map<ID, Account> parentAccts = new Map<ID, Account>(); //Making it a map instead of list for easier lookup
          //List<Id> listIds = new List<Id>();
            Set<Id> setIds=new Set<Id>();
        
            for (Order childObj : newOrders) {
            setIds.add(childObj.AccountId);
          }
        
            system.debug('The value is: ' + parentAccts);
            //parentAccts = new Map<Id, Account>([Select id,Name,Upgrade_Order_Date__c,(Select id,EffectiveDate,Name,Header_Id__c from Orders where RecordType.name = 'Upgrade Order' ORDER BY Header_Id__c DESC) from Account WHERE  ID IN :setIds AND RecordType.name = 'Recipient']);
          parentAccts = new Map<Id, Account>([Select id,Name,Upgrade_Order_Date__c,(Select id,Name,EffectiveDate,Header_Id__c,Status from Orders where RecordType.name = 'Upgrade Order' ORDER BY Header_Id__c DESC NULLS LAST) from Account WHERE  ID IN :setIds AND RecordType.name = 'Recipient' ]);
          for (Order order: newOrders){
              
            // if(Order.Type=='Upgrade Order'){
              
             Account myParentAcct = parentAccts.get(order.Name);
               system.debug('The value is: ' + myParentAcct);    
             myParentAcct.Upgrade_Order_Date__c= order.EffectiveDate;
              //order.EffectiveDate=myParentAcct.Upgrade_Order_Date__c;
             
              //}
          }
        system.debug('The value is: ' + parentAccts);
   		 update parentAccts.values();
         
            }
     
        
    }


 
Aishwarya_TodkarAishwarya_Todkar
Hi,
Put following code into containsKey check. 

Account myParentAcct = parentAccts.get(order.Name);
system.debug('The value is: ' + myParentAcct);   
myParentAcct.Upgrade_Order_Date__c= order.EffectiveDate;

Also initialize the List<Order>newOrders. i.e  List<Order> newOrders = new  List<Order>();

Thanks!
shaik shoukathshaik shoukath
trigger Ordertrigger on Order (after insert,after update) {
    
    set<id> accIds =new set<id>();
    for(order ord:trigger.new)        
    {
        if(ord.AccountId !=null)
        accIds.add(ord.accountId);
    }
    
    map<id, account> accmap = new map<id,account>([Select id,name,Upgrade_Order_Date__c from Account where Id In:accIds ]);
     List<Account> updateDate =new List<Account>();                                       
   
     for(order ord:trigger.new)        
      {
      if(accmap.containskey(ord.AccountId))
      {
         account acc = accmap.get(ord.AccountId);
         acc.Upgrade_Order_Date__c  = ord.effectivedate;
         updateDate.add(acc);        
      }
      
      }
                            
    update updateDate;
  }