You need to sign in to do that
Don't have an account?
Map.get() method always returns NULL on developer edition
Hi, I'm having a similar issue with using a Map<id,Product2>
The weird thing is that it works perfectly in sandbox but not in development... wtf apex?
I'm not going to post the entire trigger code here, as it's not necessary, I have narrowed the issue down to the Map .get() method:
Results of Execute Anonymous:
11:33:25.101|USER_DEBUG|[24]|DEBUG|Keyset: {01t50000001LcjyAAC}
11:33:25.101|METHOD_EXIT|[24]|System.debug(ANY)
11:33:25.101|METHOD_ENTRY|[25]|System.debug(ANY)
11:33:25.101|METHOD_ENTRY|[25]|MAP.values()
11:33:25.101|METHOD_EXIT|[25]|MAP.values()
11:33:25.102|USER_DEBUG|[25]|DEBUG|Product: 2-Mercaptoethanol
11:33:25.102|METHOD_EXIT|[25]|System.debug(ANY)
11:33:25.102|METHOD_ENTRY|[29]|System.debug(ANY)
11:33:25.102|USER_DEBUG|[29]|DEBUG|Product__c: 01t50000001LcjyAAC
11:33:25.102|METHOD_EXIT|[29]|System.debug(ANY)
11:33:25.102|METHOD_ENTRY|[30]|MAP.get(ANY)
11:33:25.102|METHOD_EXIT|[30]|MAP.get(ANY)
11:33:25.102|EXCEPTION_THROWN|[31]|System.NullPointerException: Attempt to de-reference a null object
11:33:25.102|FATAL_ERROR|System.NullPointerException: Attempt to de-reference a null object
Trigger.Product_Lot_Trigger: line 31, column 4
So if you look at the highlighted lines (DEBUG outputs), you can plainly see that the map contains a valid ID, and the
hard-coded get() on line 25 returns the correct object and displays the correct name, so the Value is correct too.
Also you can see that the field Product__c (on line 29) exactly matches the key that is in the Map.
But line 30 is still returning NULL!!!!
I'm just starting to get angry at this point, because this works 100% correctly in the Sandbox. Can anyone help?
Are you sure it's returning null? I think the problem is actually on line 31. Does the object you are getting from you map have a non-null value for "Inventory_on_Hand__c" and do all the Product_Lot__c objects in your loop have a non-null value for "Quantity__c"?
If any of these values are null you'll get the error you are seeing.
All Answers
is pMap declared as static?
are you processing bulk records in Developer versus Sandbox?
I am pretty sure that when you fill the map the value for this
pMap.get(pl.Product__c) is null
I would like to see how have you filled the Map. Please add a
system.debug(' *************** pMap : ' + pMap);
before your loop starts.
anda system.debut(' *********** pl.Product__c ' + pl.Product__c); just before you get null pointor exception.
Are you sure it's returning null? I think the problem is actually on line 31. Does the object you are getting from you map have a non-null value for "Inventory_on_Hand__c" and do all the Product_Lot__c objects in your loop have a non-null value for "Quantity__c"?
If any of these values are null you'll get the error you are seeing.
Hi David, your post helped me, you were right about Null values.
I had just assumed that if a number field is blank, it's treated as a 0. When in fact it's treated as a NULL.
So the issue was with the Product2 that I was using to test it. Specifically with the Inventory_on_Hand__c field.
It should have been 0 by default, but in fact it was blank (NULL)
So when I tried to add the Quantity__c, it throws a null pointer exception.
When I set Inventory_on_Hand__c to 0 then I didn't get the exception!
Thanks for your help everyone, sorry if I wasted your time!
Downstairs,
I noticed when you posted your full trigger + test that you were hardcoding your Product Id in the test method even though you were creating a product record in the same method. Not sure if there was a particular reason for that, but it seemed odd to me.
Yah i was kind of cutting the code up a bit, I had some other test stuff in there before, which is why it worked in the sandbox edition, but it was failing when I tried testing it on actual records in SF.
Thanks again!
ps I deleted the post with the full trigger, as it turned out not to be a problem with my code, after all :)
No problem. Glad I could at least nudge you in the right direction :)
Found that I had to seperate the get into a temporary list:
list<Custom_Object__c> templist = MyMap.get(lookupItem);
if (templist != null){
for(Custom_Object__c listToWorkOn:templist ){
// do stuff to listToWorkOn
}
}