Попытка разыменования нулевого объекта 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
));
}