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()之后,我在我的参数化构造函数中编写默认构造函数的代码,它仍然抛出空指针异常