假设您运行的SOQL聚合查询如下所示:
select OwnerId, sum(ExpectedRevenue)val from Opportunity GROUP BY ROLLUP(OwnerId)
无论出于何种原因,都没有填充ExpectedRevenue字段的商机。
你得到的表格如下:
VAL ___ | OWNERID
|Id1 |Id2 |Id3
4/4记录。
(旁注:如果没有看起来很糟糕,你如何输入表格数据?)
请注意,“val”列全部为空,最后一个OwnerId列也为空。
有4行,因为SOQL在汇总时返回“总”行。
循环遍历返回的AggregateResult []时,代码会在如下所示的行上爆炸:AggregateResult [0] .get('val');使用“System.NullPointerException:尝试取消引用空对象”
然而,如果这些用户中只有一个拥有一些数据,那么整个过程就可以了。所以我猜测如果没有行在特定列中有任何数据,那么该列根本就不存在,并且调用它来检索它会爆炸。
所以我的问题是你如何确定列是否存在以避免空引用错误?
答案 0 :(得分:1)
你已经说过ownerid列和val列都是null,因此AggregateResult [0]是一个指向null对象的指针,任何从该对象获取alue的尝试都会给你带来错误。
我希望你做的是在你运行
之前AggregateResult[0].get('val');
你想要一个if语句说
if(AggregateResult.size() > 0)
或可能
if(AggregateResult[0] != null)
确保您没有尝试访问空对象。
尝试一下,它应该工作。否则,请发布更大的代码清单以进行查看。
保
答案 1 :(得分:0)
如果没有数据汇总您在where
子句中指定的过滤器,则会获得AggregateResult
的空列表。您可以使用Apex中的列表isEmpty()
来测试。