function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
MaheemSamMaheemSam 

System.NullPointerException: Argument 1 cannot be null

Hi, 

 Need a help in one of the strange error am getting in the below controller calling this from visualforce page. 

Below is the error am getting while loading the visualforce page 

System.NullPointerException: Argument 1 cannot be null 
Class.ShareForecastController.getRoles: line 37, column 1​

Please suggest me how to fix this error. 


Class
public with sharing class ShareForecastController {

    public List<User> users {get;set;}
    private String soql {get;set;}
    private Map<Id,User> rolesMap;
    private String userId;
    private String userRoleId = '';
	private Set<Id> alreadySharedUserIds;

    public String shareToUserId {
        get  { if (shareToUserId == null) {  shareToUserId = ''; } return shareToUserId;  }
        set;
    }

    public String sortDir {
        get  { if (sortDir == null) {  sortDir = 'asc'; } return sortDir;  }
        set;
    }

    public String sortField {
        get  { if (sortField == null) {sortField = 'UserRole.name'; } return sortField;  }
        set;
    }

    public string getSelectedRole(){
         return userRoleId ;
    }

    public void setSelectedRole(String s){
        this.userRoleId  = s;
    }

    public list<SelectOption>getRoles(){
        list<SelectOption> options = new list<SelectOption>();
        options.add(new SelectOption('-- Select Role --', '-- Select Role --', true));
        for(User obj : rolesMap.values()) {
            options.add(new SelectOption(obj.UserRoleId,obj.UserRole.name));
        }
         return options;
    }
	
	public ShareForecastController() {
		alreadySharedUserIds = new Set<Id>();
        users = new List<User>();
        userId = userInfo.getUserId();
        userRoleId = userInfo.getUserRoleId();
		
		for(Custom_Forecast_Share__c obj : [Select id,Name,Forecast_Shared_To__c from Custom_Forecast_Share__c where isActive__c  = true]) {
			alreadySharedUserIds.add(obj.Forecast_Shared_To__c);
		}
		
        soql = 'SELECT Id,FirstName,LastName,UserRoleId,UserRole.name,UserRole.ParentRoleId FROM User WHERE Id Not IN :alreadySharedUserIds AND IsActive = True AND ForecastEnabled = True';
        runQuery();
        rolesMap = new Map<Id,User>();
        for(User obj : users) {
            rolesMap.put(obj.UserRoleId,obj);
        }
    }

    public void toggleSort() {
        sortDir = sortDir.equals('asc') ? 'desc' : 'asc';
        runQuery();
    }

    public void toggleRole() {
        system.debug('In toggleRole userRoleId: '+userRoleId);
        soql = 'SELECT Id,FirstName,LastName,UserRoleId,UserRole.name,UserRole.ParentRoleId FROM User WHERE Id Not IN :alreadySharedUserIds AND IsActive = True AND ForecastEnabled = True AND UserRoleId = :userRoleId';
        runQuery();
    }

    public void runQuery() {
        try {
            users = Database.query(soql + ' AND id != :userId order by ' + sortField + ' ' + sortDir+ ' LIMIT 999');
            system.debug('Final Query'+soql + ' AND id != :userId order by ' + sortField + ' ' + sortDir);

            if(users.size() <= 0) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'No records were found based on your criteria'));
            }
        } catch (Exception e) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Ooops!'+e.getMessage()));
        }
    }

    public PageReference runSearch() {

        String Name = Apexpages.currentPage().getParameters().get('name');

        soql = 'SELECT Id,FirstName,LastName,UserRole.name FROM User WHERE IsActive = True AND ForecastEnabled = True';
        if (!Name.equals(''))
            soql += ' AND Name LIKE \'%'+String.escapeSingleQuotes(Name)+'%\'';

        runQuery();

        return null;
    }

    public PageReference shareForecast() {
        try{
            Custom_Forecast_Share__c ojb = new Custom_Forecast_Share__c(
                Forecast_Owner__c = userId,
                Forecast_Shared_To__c = shareToUserId,
                isActive__c = true
            );
            insert ojb;
        } catch(Exception e) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Ooops! Something went wrong.'));
            return null;
        }

        PageReference pg = Page.Forecasting;
        pg.setRedirect(true);
        return pg ;
    }    

}

Visual Force Page. 
<apex:page controller="ShareForecastController" sidebar="false" title="Share Forecast" tabStyle="Custom_Forecast__tab">
   <apex:form >
      <apex:pageMessages id="errors" />
      
         <apex:sectionHeader title="Share Forecast" subtitle="Share your forecast"/>

         <table width="100%" border="0">
            <tr>
               <td width="200" valign="top">
                  <apex:pageBlock title="Search" mode="edit" id="criteria">
                     <script type="text/javascript">
                        function doSearch() {
                            var Name = document.getElementById("Name").value;
                            //console.log(Name );

                            if(Name == '') {
                                alert('Please enter your search criteria.');
                                return false;
                            }else{
                                searchServer(
                                    document.getElementById("Name").value
                                );
                            }
                        }
                     </script> 
                     <apex:actionFunction name="searchServer" action="{!runSearch}" rerender="results,errors">
                        <apex:param name="Name" value="" />
                     </apex:actionFunction>
                     <table cellpadding="2" cellspacing="2">
                        <tr>
                           <td style="font-weight:bold;">Name<br/>
                              <input type="text" id="Name"/>
                           </td>
                        </tr>
                        <tr>
                           <td style="font-weight:bold;">
                               <apex:commandButton value="Search" onclick="doSearch();" reRender="forRerender" status="searchStatus"/>
                               <apex:inputHidden id="forRerender"/>
                               <apex:actionStatus startText="Searching..." id="searchStatus">
                                   <apex:facet name="stop"></apex:facet>
                               </apex:actionStatus>
                           </td>
                        </tr>
                     </table>
                  </apex:pageBlock>
               </td>
               
               <td valign="top">
                  <apex:pageBlock mode="edit" id="results">
                      <apex:pageBlockSection >
                          <apex:pageblockSectionItem >
                              <apex:outputLabel >Roles:&nbsp;</apex:outputLabel>
                              <apex:selectlist value="{!SelectedRole}" size="1">
                                 <apex:actionSupport event="onchange" action="{!toggleRole}" rerender="results"/>
                                 <apex:selectOptions value="{!Roles}"  />
                              </apex:selectlist>
                          </apex:pageblockSectionItem>
                      </apex:pageBlockSection>

                    <apex:pageBlockTable value="{!users}" var="user" rendered="{!users.size>0}">
                        <apex:column >
                           <apex:facet name="header">
                              <apex:commandLink value="First Name" action="{!toggleSort}" rerender="results">
                                 <apex:param name="sortField" value="firstName" assignTo="{!sortField}"/>
                              </apex:commandLink>
                           </apex:facet>
                           <apex:outputField value="{!user.firstName}"/>
                        </apex:column>
                        <apex:column >
                           <apex:facet name="header">
                              <apex:commandLink value="Last Name" action="{!toggleSort}" rerender="results">
                                 <apex:param name="sortField" value="lastName" assignTo="{!sortField}"/>
                              </apex:commandLink>
                           </apex:facet>
                           <apex:outputField value="{!user.lastName}"/>
                        </apex:column>
                        <apex:column >
                           <apex:facet name="header">
                              <apex:commandLink value="Role" action="{!toggleSort}" rerender="results">
                                 <apex:param name="sortField" value="UserRole.Name" assignTo="{!sortField}"/>
                              </apex:commandLink>
                           </apex:facet>
                           <apex:outputField value="{!user.UserRole.name}"/>
                        </apex:column>
                        <apex:column headerValue="Action" width="100">
                            <apex:commandLink value="Share Forecast" action="{!shareForecast}" reRender="errors">
                                <apex:param name="shareToUserI" value="{!user.Id}" assignTo="{!shareToUserId}"/>
                            </apex:commandLink>
                        </apex:column>
                     </apex:pageBlockTable>
                  </apex:pageBlock>
               </td>
            </tr>
         </table>
   </apex:form>
</apex:page>

 
Best Answer chosen by MaheemSam
Apoorv Saxena 4Apoorv Saxena 4
Hi Sudhir,

Try replacing your controller code with this:
 
public with sharing class ShareForecastController {

    public List<User> users {get;set;}
    private String soql {get;set;}
    private Map<Id,User> rolesMap;
    private String userId;
    private String userRoleId = '';
	private Set<Id> alreadySharedUserIds;

    public String shareToUserId {
        get  { if (shareToUserId == null) {  shareToUserId = ''; } return shareToUserId;  }
        set;
    }

    public String sortDir {
        get  { if (sortDir == null) {  sortDir = 'asc'; } return sortDir;  }
        set;
    }

    public String sortField {
        get  { if (sortField == null) {sortField = 'UserRole.name'; } return sortField;  }
        set;
    }

    public string getSelectedRole(){
         return userRoleId ;
    }

    public void setSelectedRole(String s){
        this.userRoleId  = s;
    }

    public list<SelectOption>getRoles(){
        list<SelectOption> options = new list<SelectOption>();
        options.add(new SelectOption('-- Select Role --', '-- Select Role --', true));
        for(User obj : rolesMap.values()) {
            options.add(new SelectOption(obj.UserRoleId,obj.UserRole.name));
        }
         return options;
    }
	
	public ShareForecastController() {
		alreadySharedUserIds = new Set<Id>();
        users = new List<User>();
        userId = userInfo.getUserId();
        userRoleId = userInfo.getUserRoleId();
		
		for(Custom_Forecast_Share__c obj : [Select id,Name,Forecast_Shared_To__c from Custom_Forecast_Share__c where isActive__c  = true]) {
			alreadySharedUserIds.add(obj.Forecast_Shared_To__c);
		}
		
        soql = 'SELECT Id,FirstName,LastName,UserRoleId,UserRole.name,UserRole.ParentRoleId FROM User WHERE Id Not IN :alreadySharedUserIds AND IsActive = True AND ForecastEnabled = True';
        runQuery();
        rolesMap = new Map<Id,User>();
        for(User obj : users) {
			if(obj.UserRoleId<>null){
				rolesMap.put(obj.UserRoleId,obj);
			}
        }
    }

    public void toggleSort() {
        sortDir = sortDir.equals('asc') ? 'desc' : 'asc';
        runQuery();
    }

    public void toggleRole() {
        system.debug('In toggleRole userRoleId: '+userRoleId);
        soql = 'SELECT Id,FirstName,LastName,UserRoleId,UserRole.name,UserRole.ParentRoleId FROM User WHERE Id Not IN :alreadySharedUserIds AND IsActive = True AND ForecastEnabled = True AND UserRoleId = :userRoleId';
        runQuery();
    }

    public void runQuery() {
        try {
            users = Database.query(soql + ' AND id != :userId order by ' + sortField + ' ' + sortDir+ ' LIMIT 999');
            system.debug('Final Query'+soql + ' AND id != :userId order by ' + sortField + ' ' + sortDir);

            if(users.size() <= 0) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'No records were found based on your criteria'));
            }
        } catch (Exception e) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Ooops!'+e.getMessage()));
        }
    }

    public PageReference runSearch() {

        String Name = Apexpages.currentPage().getParameters().get('name');

        soql = 'SELECT Id,FirstName,LastName,UserRole.name FROM User WHERE IsActive = True AND ForecastEnabled = True';
        if (!Name.equals(''))
            soql += ' AND Name LIKE \'%'+String.escapeSingleQuotes(Name)+'%\'';

        runQuery();

        return null;
    }

    public PageReference shareForecast() {
        try{
            Custom_Forecast_Share__c ojb = new Custom_Forecast_Share__c(
                Forecast_Owner__c = userId,
                Forecast_Shared_To__c = shareToUserId,
                isActive__c = true
            );
            insert ojb;
        } catch(Exception e) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Ooops! Something went wrong.'));
            return null;
        }

        PageReference pg = Page.Forecasting;
        pg.setRedirect(true);
        return pg ;
    }    

}

If this answered your question then mark it as Solved so that others can view it as a proper solution.

Thanks,
Apoorv

All Answers

Apoorv Saxena 4Apoorv Saxena 4
Hi Sudhir,

Try replacing your controller code with this:
 
public with sharing class ShareForecastController {

    public List<User> users {get;set;}
    private String soql {get;set;}
    private Map<Id,User> rolesMap;
    private String userId;
    private String userRoleId = '';
	private Set<Id> alreadySharedUserIds;

    public String shareToUserId {
        get  { if (shareToUserId == null) {  shareToUserId = ''; } return shareToUserId;  }
        set;
    }

    public String sortDir {
        get  { if (sortDir == null) {  sortDir = 'asc'; } return sortDir;  }
        set;
    }

    public String sortField {
        get  { if (sortField == null) {sortField = 'UserRole.name'; } return sortField;  }
        set;
    }

    public string getSelectedRole(){
         return userRoleId ;
    }

    public void setSelectedRole(String s){
        this.userRoleId  = s;
    }

    public list<SelectOption>getRoles(){
        list<SelectOption> options = new list<SelectOption>();
        options.add(new SelectOption('-- Select Role --', '-- Select Role --', true));
        for(User obj : rolesMap.values()) {
            options.add(new SelectOption(obj.UserRoleId,obj.UserRole.name));
        }
         return options;
    }
	
	public ShareForecastController() {
		alreadySharedUserIds = new Set<Id>();
        users = new List<User>();
        userId = userInfo.getUserId();
        userRoleId = userInfo.getUserRoleId();
		
		for(Custom_Forecast_Share__c obj : [Select id,Name,Forecast_Shared_To__c from Custom_Forecast_Share__c where isActive__c  = true]) {
			alreadySharedUserIds.add(obj.Forecast_Shared_To__c);
		}
		
        soql = 'SELECT Id,FirstName,LastName,UserRoleId,UserRole.name,UserRole.ParentRoleId FROM User WHERE Id Not IN :alreadySharedUserIds AND IsActive = True AND ForecastEnabled = True';
        runQuery();
        rolesMap = new Map<Id,User>();
        for(User obj : users) {
			if(obj.UserRoleId<>null){
				rolesMap.put(obj.UserRoleId,obj);
			}
        }
    }

    public void toggleSort() {
        sortDir = sortDir.equals('asc') ? 'desc' : 'asc';
        runQuery();
    }

    public void toggleRole() {
        system.debug('In toggleRole userRoleId: '+userRoleId);
        soql = 'SELECT Id,FirstName,LastName,UserRoleId,UserRole.name,UserRole.ParentRoleId FROM User WHERE Id Not IN :alreadySharedUserIds AND IsActive = True AND ForecastEnabled = True AND UserRoleId = :userRoleId';
        runQuery();
    }

    public void runQuery() {
        try {
            users = Database.query(soql + ' AND id != :userId order by ' + sortField + ' ' + sortDir+ ' LIMIT 999');
            system.debug('Final Query'+soql + ' AND id != :userId order by ' + sortField + ' ' + sortDir);

            if(users.size() <= 0) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'No records were found based on your criteria'));
            }
        } catch (Exception e) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Ooops!'+e.getMessage()));
        }
    }

    public PageReference runSearch() {

        String Name = Apexpages.currentPage().getParameters().get('name');

        soql = 'SELECT Id,FirstName,LastName,UserRole.name FROM User WHERE IsActive = True AND ForecastEnabled = True';
        if (!Name.equals(''))
            soql += ' AND Name LIKE \'%'+String.escapeSingleQuotes(Name)+'%\'';

        runQuery();

        return null;
    }

    public PageReference shareForecast() {
        try{
            Custom_Forecast_Share__c ojb = new Custom_Forecast_Share__c(
                Forecast_Owner__c = userId,
                Forecast_Shared_To__c = shareToUserId,
                isActive__c = true
            );
            insert ojb;
        } catch(Exception e) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Ooops! Something went wrong.'));
            return null;
        }

        PageReference pg = Page.Forecasting;
        pg.setRedirect(true);
        return pg ;
    }    

}

If this answered your question then mark it as Solved so that others can view it as a proper solution.

Thanks,
Apoorv
This was selected as the best answer
MaheemSamMaheemSam
Thanks Apoorv only changes is made adding below condition I will deploy this changes in production and let me test hope this should reslolve the issue 
 
if(obj.UserRoleId<>null){

​}


Thanks

Sudhir