使用Salesforce Visualforce创建表单保存时遇空对象引用错误求助
问题排查:Visualforce表单保存时的空对象引用错误
报错信息:
Attempt to de-reference a null object
Error is in expression '{!save}' in component apex:commandButton in page contract_object: Class.ContractController.save: line 7, column 1
An unexpected error has occurred. Your development organization has been notified.
Visualforce页面代码
<apex:page Controller="ContractController" sidebar="false" showHeader="false"> <apex:form > <apex:pageBlock title="Contract Form"> <apex:pageBlockSection columns="1"> <apex:inputField value="{!conObj.Name}"/> <apex:inputField value="{!conObj.First_Name__c}" /> <apex:inputField value="{!conObj.Last_Name__c}" /> <apex:inputField value="{!conObj.Phone_Number__c}" /> <apex:inputField value="{!conObj.Address__c}" /> <apex:inputField value="{!conObj.Email__c}" /> <apex:commandButton value="Save" action="{!save}"/> </apex:pageBlockSection> </apex:pageBlock> </apex:form> </apex:page>
Apex控制器代码
public with sharing class ContractController { public Contract__c conObj {get; set;} public void newContract() { conObj = new Contract__c(); } public void save() { insert conObj; } }
问题原因与解决方案
原因
conObj对象未被初始化:你定义了newContract()方法来创建Contract__c实例,但这个方法从未被调用过。当点击保存按钮执行save()方法时,conObj仍然是null,触发空对象引用错误。
解决方法(二选一即可)
方法1:在控制器构造方法中初始化对象
修改控制器,添加构造方法,确保页面加载时自动初始化conObj:
public with sharing class ContractController { public Contract__c conObj {get; set;} // 构造方法,控制器实例化时自动执行 public ContractController() { conObj = new Contract__c(); } public void save() { insert conObj; } }
方法2:通过页面action属性触发初始化
修改Visualforce页面的apex:page标签,添加action属性调用newContract()方法:
<apex:page Controller="ContractController" sidebar="false" showHeader="false" action="{!newContract}"> <!-- 原有表单内容保持不变 --> </apex:page>
两种方法都能确保conObj在保存前被正确实例化,避免空对象引用错误。
内容的提问来源于stack exchange,提问作者srinu
相关产品推荐
相关产品推荐

