Java 为什么参数化构造函数的实例变量初始化需要默认构造函数调用?
我在代码中定义了两个构造函数Java 为什么参数化构造函数的实例变量初始化需要默认构造函数调用?,java,constructor,Java,Constructor,我在代码中定义了两个构造函数 public SAPRoleImpl() { dateParser=new SimpleDateFormat(MIDDAY_DATE_FORMAT); dateParser.setTimeZone(TimeZone.getTimeZone("GMT")); Calendar c=Calendar.getInstance(TimeZone.getTimeZone("GMT")); c.set(Calendar.HOUR_OF_DAY,1
public SAPRoleImpl()
{
dateParser=new SimpleDateFormat(MIDDAY_DATE_FORMAT);
dateParser.setTimeZone(TimeZone.getTimeZone("GMT"));
Calendar c=Calendar.getInstance(TimeZone.getTimeZone("GMT"));
c.set(Calendar.HOUR_OF_DAY,12);
c.set(Calendar.MINUTE,0);
c.set(Calendar.SECOND,0);
c.set(Calendar.MILLISECOND,0);
setStartDate(c.getTime());
}
public SAPRoleImpl(String formattedRole)
{
this();
...
}
当我执行以下代码时:
public static void main(String[] args) {
SAPRoleImpl sapRole = new SAPRoleImpl("abc|abcdesc||");
System.out.println(sapRole);
}
它给出了这个输出
:abc|20170127||
这是意料之中的。但是当我只想要一个
abc|||
i、 e没有要初始化的开始日期,我尝试了以下代码:
public SAPRoleImpl()
{
}
public SAPRoleImpl(String formattedRole)
{
this();
...
}
这导致出现NullPointerException
。可能,startdate
似乎为空,但我无法理解其背后的原因
有人能帮我理解吗
显然,您有一个字段startDate,只有在调用方法
setStartDate()
时,它才会被赋值
当您忽略在构造函数中调用该方法时,该字段将保留为null
最有可能的情况是,在null字段上调用一些方法,如toString()
顺便说一句:你的构造函数链接错误了
通常的方法是调用一个接受更多参数的ctor,如:
public public SAPRoleImpl() {
this(SOME_DEFAULT_FORMAT_STRING);
}
public SAPRoleImpl(String format) {
dateParser=new SimpleDateFormat(format);
...
setStartDate(c.getTime());
}
换句话说:您绝对希望将“真正的”init代码放入一个构造函数中;或者,如果没有其他方法,只能在多个构造函数中执行稍有不同的操作,则可以使用一个init方法。那么,问题可能出在您的
toString()
覆盖中,您还没有向我们展示。请提供-并确保您的文章格式尽可能清晰。。。我已经重新格式化了最初的帖子,但是当您编辑它以提供完整的示例时,请使用预览以确保它仍然尽可能可读。您可以在第一个构造函数版本中通过setter设置开始日期:setStartDate(c.getTime())代码>然后您删除了该行。-为什么你认为startDate不能为null?好吧,由于toString()我面临一个问题,这是我的toString()部分toString(){buff.append(ROLES_DELIM);Date endDate=getEndDate();if(endDate!=null)buff.append(dateFormatter.format(endDate));buff.append(ROLES_DELIM);return buff.toString();}但是如果,在this()之后,我在我的参数化构造函数中编写默认构造函数的代码,它仍然抛出空指针异常