Попытка разыменования нулевого объекта Salesforce

Я сделал триггер для обновления идентификатора контакта в личном кабинете, и он работает для учетных записей пользователей. Он заполняет поле идентификатора контакта в личном кабинете.

Проблема в том, что выдает ошибку в типе записи учетной записи предприятия и работодателя. Я также вставил проверку типа записи. Но все равно дает ошибку

при ошибке: неверные данные.

Просмотрите все сообщения об ошибках ниже, чтобы исправить ваши данные.

Триггер Apex UpdateContactID вызвал непредвиденное исключение, обратитесь к администратору: UpdateContactID: выполнение AfterInsert вызвано: System.NullPointerException: Попытка отменить ссылку на нулевой объект: Trigger.UpdateContactID: строка 41, столбец 1

Триггер ниже:

trigger UpdateContactID on Account (after insert, after update) 
{

 //Identify applicable record type
    RecordType PersonAccount = [SELECT Id FROM RecordType WHERE SobjectType='Account' AND Name = 'Career Champion Account' limit 1];

 List<Account> toUpdate = new List<Account>();

if(trigger.isInsert) 
{



 List<String> newAccountIDList = new List<String>();


 // Taking all account IDs in collection
 for(Account acct: Trigger.new)
 {  
  newAccountIDList.add(acct.ID); 
 }

 // Fetching contacts against the account IDs
 List<Contact> contactList = [SELECT Id, Account.Id FROM Contact WHERE Account.ID in :newAccountIDList];      


 // Adding contacts in a map with relation to Account ID
 Map<String, Contact> mapContact = new Map<String, Contact>();
 for(Contact cont : contactList)
 {
  mapContact.put(cont.Account.Id, cont) ;
 }


 // Updating Contact_ID__c from Map to new Account list to update
 List<Account> newAccounts = [select Id, Contact_ID__c from Account where Id in :newAccountIDList];

 for(Account acct: newAccounts)
 {  
 **LINE 41**  
toUpdate.add(new Account(
  id = acct.Id,
  Contact_ID__c = mapContact.get(acct.Id).Id
 ));
}

update toUpdate;

} // if
else if(trigger.isUpdate && trigger.new[0].Contact_ID__c == null && trigger.old[0].Contact_ID__c == null) 
{



 List<String> newAccountIDList = new List<String>();


 // Taking all account IDs in collection
 for(Account acct: Trigger.new)
 {  
  newAccountIDList.add(acct.ID); 
 }

 // Fetching contacts against the account IDs
 List<Contact> contactList = [SELECT Id, Account.Id FROM Contact WHERE Account.ID in :newAccountIDList];      


 // Adding contacts in a map with relation to Account ID
 Map<String, Contact> mapContact = new Map<String, Contact>();
 for(Contact cont : contactList)
 {
  mapContact.put(cont.Account.Id, cont) ;
  }


 // Updating Contact_ID__c from Map to new Account list to update
 List<Account> newAccounts = [select Id, Contact_ID__c from Account where Id in :newAccountIDList];
// List<Account> toUpdate = new List<Account>();
 for(Account acct: newAccounts)
 {  

  toUpdate.add(new Account(
   id = acct.Id,
   Contact_ID__c = mapContact.get(acct.Id).Id
  ));
 }

 update toUpdate;

 } // else if

} // trigger

1 ответ

Более вероятный mapContact не содержит значение для ключа acct.Id, mapContact.get(acct.Id) вызов вернет ноль и следующее .Id выдаст исключение нулевой ссылки.

Вы должны добавить защитное заявление перед этой строкой. Например

if(mapContact.containsKey(acct.Id)) {
    toUpdate.add(new Account(
      id = acct.Id,
      Contact_ID__c = mapContact.get(acct.Id).Id
     ));
}
Другие вопросы по тегам