You need to sign in to do that
Don't have an account?
coolkrish
Wrapper class: error attempt to de-reference a null object
Hi,
I am invoking a wrapper class to display fields from multiple objects in a pop-up window.
I am getting Attempt to de-reference a null object error at line 22.Please help.
Below is the apex class and VFP:
apex class:
public class show_RepAccess_GILD {
public List<wrapper> wrapperList {get; set;}
public List<TSF_vod__c> tsfList = new List<TSF_vod__c>();
public List<User> listOfUsrs = new List<User>();
List<String> TerrNames = new List<String>();
List<Id> TerrIds = new List<Id>();
public id accid{get;set;}
public show_RepAccess_GILD(ApexPages.StandardController controller)
{
accid = ApexPages.currentPage().getParameters().get('id');
fetchTSFList();
System.debug('v tsfList:' + tsfList);
System.debug('v listOfUsrs:' + listOfUsrs);
if(tsfList.size()>0) {
for(TSF_vod__c tsf : tsfList)
{
wrapper w = new wrapper(tsf);
wrapperList.add(w);
}
}
if(listOfUsrs.size()>0) {
for(User usr: listOfUsrs)
{
wrapper w = new wrapper(usr);
wrapperList.add(w);
}
}
}
public void fetchTSFList(){
Map<Id, Id> mapUsrTerr = new Map<Id, Id>();
List<UserTerritory> listOfUsrTerrsIds = new List<UserTerritory>();
tsfList =[select Territory_vod__c,Rep_Access_GILD__c from TSF_vod__c where Account_vod__c = :accid ];
for(TSF_vod__c tl:tsfList) {
TerrNames.add(tl.Territory_vod__c);
}
//Query in Territory Object for Ids
List<Territory> listOfTerrs = [SELECT Id FROM Territory WHERE Name IN :TerrNames];
for(Territory tr : listOfTerrs){
TerrIds.add(tr.Id);
}
//Query in UserTerritory Object for User Ids
listOfUsrTerrsIds = [SELECT Id,UserId FROM UserTerritory WHERE TerritoryId IN :TerrIds];
for(UserTerritory ut : listOfUsrTerrsIds){
mapUsrTerr.put(ut.Id, ut.UserId);
}
//Query in User Object for the name of user
listOfUsrs = [SELECT Name FROM User WHERE Id IN :mapUsrTerr.values()];
}
public class wrapper
{
public TSF_vod__c tsf {get; set;}
public User usr {get;set;}
public wrapper(TSF_vod__c tsf)
{
this.tsf = tsf;
}
public wrapper(User usr)
{
this.usr = usr;
}
}
}
VFP:
<apex:page standardController="Account" extensions="show_RepAccess_GILD" showHeader="false" sidebar="false" setup="false" docType="html-5.0">
<apex:form >
<apex:dataTable value="{!wrapperList}" var="wrapper" >
<apex:column >
<apex:facet name="header">Rep Access</apex:facet>
{!wrapper.tsf.Rep_Access_GILD__c}
</apex:column>
<apex:column >
<apex:facet name="header">Rep Name</apex:facet>
{!wrapper.usr.Name}
</apex:column>
</apex:dataTable>
</apex:form>
</apex:page>
I am invoking a wrapper class to display fields from multiple objects in a pop-up window.
I am getting Attempt to de-reference a null object error at line 22.Please help.
Below is the apex class and VFP:
apex class:
public class show_RepAccess_GILD {
public List<wrapper> wrapperList {get; set;}
public List<TSF_vod__c> tsfList = new List<TSF_vod__c>();
public List<User> listOfUsrs = new List<User>();
List<String> TerrNames = new List<String>();
List<Id> TerrIds = new List<Id>();
public id accid{get;set;}
public show_RepAccess_GILD(ApexPages.StandardController controller)
{
accid = ApexPages.currentPage().getParameters().get('id');
fetchTSFList();
System.debug('v tsfList:' + tsfList);
System.debug('v listOfUsrs:' + listOfUsrs);
if(tsfList.size()>0) {
for(TSF_vod__c tsf : tsfList)
{
wrapper w = new wrapper(tsf);
wrapperList.add(w);
}
}
if(listOfUsrs.size()>0) {
for(User usr: listOfUsrs)
{
wrapper w = new wrapper(usr);
wrapperList.add(w);
}
}
}
public void fetchTSFList(){
Map<Id, Id> mapUsrTerr = new Map<Id, Id>();
List<UserTerritory> listOfUsrTerrsIds = new List<UserTerritory>();
tsfList =[select Territory_vod__c,Rep_Access_GILD__c from TSF_vod__c where Account_vod__c = :accid ];
for(TSF_vod__c tl:tsfList) {
TerrNames.add(tl.Territory_vod__c);
}
//Query in Territory Object for Ids
List<Territory> listOfTerrs = [SELECT Id FROM Territory WHERE Name IN :TerrNames];
for(Territory tr : listOfTerrs){
TerrIds.add(tr.Id);
}
//Query in UserTerritory Object for User Ids
listOfUsrTerrsIds = [SELECT Id,UserId FROM UserTerritory WHERE TerritoryId IN :TerrIds];
for(UserTerritory ut : listOfUsrTerrsIds){
mapUsrTerr.put(ut.Id, ut.UserId);
}
//Query in User Object for the name of user
listOfUsrs = [SELECT Name FROM User WHERE Id IN :mapUsrTerr.values()];
}
public class wrapper
{
public TSF_vod__c tsf {get; set;}
public User usr {get;set;}
public wrapper(TSF_vod__c tsf)
{
this.tsf = tsf;
}
public wrapper(User usr)
{
this.usr = usr;
}
}
}
VFP:
<apex:page standardController="Account" extensions="show_RepAccess_GILD" showHeader="false" sidebar="false" setup="false" docType="html-5.0">
<apex:form >
<apex:dataTable value="{!wrapperList}" var="wrapper" >
<apex:column >
<apex:facet name="header">Rep Access</apex:facet>
{!wrapper.tsf.Rep_Access_GILD__c}
</apex:column>
<apex:column >
<apex:facet name="header">Rep Name</apex:facet>
{!wrapper.usr.Name}
</apex:column>
</apex:dataTable>
</apex:form>
</apex:page>
A little modification to the code worked.Missing Line in bold is the cause of null pointer exception.
Working Apex code:
=================
public with sharing class show_RepAccess {
public List<wrapper> wrapperList {get; set;}
public id accid{get;set;}
public List<TSF_vod__c> tsfList = new List<TSF_vod__c>();
public List<User> listOfUsrs = new List<User>();
List<String> TerrNames = new List<String>();
List<Id> TerrIds = new List<Id>();
Map<String, Id> mapTerr = new Map<String, Id >();
Map<Id, Id> mapUsrTerr = new Map<Id, Id>();
Map<Id, User> mapUsr = new Map<Id, User>();
public show_RepAccessD(ApexPages.StandardController controller)
{
accid = ApexPages.currentPage().getParameters().get('id');
fetchTSFList();
wrapperList = new List<wrapper>();
if(tsfList.size()>0) {
for(TSF_vod__c tsf : tsfList)
{
wrapper w = new wrapper(tsf);
w.usr= mapUsr.get(mapUsrTerr.get(mapTerr.get(tsf.Territory_vod__c))); // parse through maps to get the Rep's name on User object.
wrapperList.add(w);
}
}
}
public void fetchTSFList(){ // method to parse through objects and build map to fetch Rep's name
List<UserTerritory> listOfUsrTerrsIds = new List<UserTerritory>();
tsfList =[select Territory_vod__c,Rep_Access_GILD__c from TSF_vod__c where Account_vod__c = :accid ];
for(TSF_vod__c tl:tsfList) {
TerrNames.add(tl.Territory_vod__c);
}
//Query in Territory Object for Ids
List<Territory> listOfTerrs = [SELECT Id,Name FROM Territory WHERE Name IN :TerrNames];
for(Territory tr : listOfTerrs){
mapTerr.put(tr.name,tr.id);
TerrIds.add(tr.Id);
}
//Query in UserTerritory Object for User Ids
listOfUsrTerrsIds = [SELECT Id,UserId,TerritoryId FROM UserTerritory WHERE TerritoryId IN :TerrIds];
for(UserTerritory ut : listOfUsrTerrsIds){
mapUsrTerr.put(ut.TerritoryId , ut.UserId);
}
//Query in User Object for the name of user
listOfUsrs = [SELECT Id,Name FROM User WHERE Id IN :mapUsrTerr.values()];
for(User ur : listOfUsrs){
mapUsr.put(ur.Id,ur);
}
}
public class wrapper // wrapper class
{
public TSF_vod__c tsf {get; set;}
public User usr {get;set;}
public wrapper(TSF_vod__c tsf)
{
this.tsf = tsf;
}
public wrapper(User usr)
{
this.usr = usr;
}
}
}
All Answers
this is because wrapper is having null value for user .try using map
public class show_RepAccess_GILD {
public List<wrapper> wrapperList {get; set;}
public List<TSF_vod__c> tsfList = new List<TSF_vod__c>();
public List<User> listOfUsrs = new List<User>();
List<String> TerrNames = new List<String>();
List<Id> TerrIds = new List<Id>();
public id accid{get;set;}
Map<Id, Id> mapUsrTerr = new Map<Id, Id>();
public show_RepAccess_GILD(ApexPages.StandardController controller)
{
accid = ApexPages.currentPage().getParameters().get('id');
fetchTSFList();
System.debug('v tsfList:' + tsfList);
System.debug('v listOfUsrs:' + listOfUsrs);
if(tsfList.size()>0) {
for(TSF_vod__c tsf : tsfList)
{
wrapper w = new wrapper();
w .tsf= tsf ;
w.usr=mapUsrTerr.get(mapTerr.get(tsf.name));
wrapperList.add(w);
}
}
}
public void fetchTSFList(){
List<UserTerritory> listOfUsrTerrsIds = new List<UserTerritory>();
Map<Id, Territory> mapTerr = new Map<Id, TSF_vod__c >();
tsfList =[select Territory_vod__c,Rep_Access_GILD__c from TSF_vod__c where Account_vod__c = :accid ];
for(TSF_vod__c tl:tsfList) {
TerrNames.add(tl.Territory_vod__c);
}
//Query in Territory Object for Ids
List<Territory> listOfTerrs = [SELECT Id,Name FROM Territory WHERE Name IN :TerrNames];
for(Territory tr : listOfTerrs){
mapTerr.put(tr.name,tr.id);
TerrIds.add(tr.Id);
}
//Query in UserTerritory Object for User Ids
listOfUsrTerrsIds = [SELECT Id,UserId,TerritoryId FROM UserTerritory WHERE TerritoryId IN :TerrIds];
for(UserTerritory ut : listOfUsrTerrsIds){
mapUsrTerr.put(ut.TerritoryId , ut.UserId);
}
//Query in User Object for the name of user
listOfUsrs = [SELECT Name FROM User WHERE Id IN :mapUsrTerr.values()];
}
public class wrapper
{
public TSF_vod__c tsf {get; set;}
public User usr {get;set;}
}
}
A little modification to the code worked.Missing Line in bold is the cause of null pointer exception.
Working Apex code:
=================
public with sharing class show_RepAccess {
public List<wrapper> wrapperList {get; set;}
public id accid{get;set;}
public List<TSF_vod__c> tsfList = new List<TSF_vod__c>();
public List<User> listOfUsrs = new List<User>();
List<String> TerrNames = new List<String>();
List<Id> TerrIds = new List<Id>();
Map<String, Id> mapTerr = new Map<String, Id >();
Map<Id, Id> mapUsrTerr = new Map<Id, Id>();
Map<Id, User> mapUsr = new Map<Id, User>();
public show_RepAccessD(ApexPages.StandardController controller)
{
accid = ApexPages.currentPage().getParameters().get('id');
fetchTSFList();
wrapperList = new List<wrapper>();
if(tsfList.size()>0) {
for(TSF_vod__c tsf : tsfList)
{
wrapper w = new wrapper(tsf);
w.usr= mapUsr.get(mapUsrTerr.get(mapTerr.get(tsf.Territory_vod__c))); // parse through maps to get the Rep's name on User object.
wrapperList.add(w);
}
}
}
public void fetchTSFList(){ // method to parse through objects and build map to fetch Rep's name
List<UserTerritory> listOfUsrTerrsIds = new List<UserTerritory>();
tsfList =[select Territory_vod__c,Rep_Access_GILD__c from TSF_vod__c where Account_vod__c = :accid ];
for(TSF_vod__c tl:tsfList) {
TerrNames.add(tl.Territory_vod__c);
}
//Query in Territory Object for Ids
List<Territory> listOfTerrs = [SELECT Id,Name FROM Territory WHERE Name IN :TerrNames];
for(Territory tr : listOfTerrs){
mapTerr.put(tr.name,tr.id);
TerrIds.add(tr.Id);
}
//Query in UserTerritory Object for User Ids
listOfUsrTerrsIds = [SELECT Id,UserId,TerritoryId FROM UserTerritory WHERE TerritoryId IN :TerrIds];
for(UserTerritory ut : listOfUsrTerrsIds){
mapUsrTerr.put(ut.TerritoryId , ut.UserId);
}
//Query in User Object for the name of user
listOfUsrs = [SELECT Id,Name FROM User WHERE Id IN :mapUsrTerr.values()];
for(User ur : listOfUsrs){
mapUsr.put(ur.Id,ur);
}
}
public class wrapper // wrapper class
{
public TSF_vod__c tsf {get; set;}
public User usr {get;set;}
public wrapper(TSF_vod__c tsf)
{
this.tsf = tsf;
}
public wrapper(User usr)
{
this.usr = usr;
}
}
}