我在代码中定义了两个构造函数
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|||
即没有开始日期初始化,我尝试了这段代码:
public SAPRoleImpl()
{
}
public SAPRoleImpl(String formattedRole)
{
this();
...
}
这导致了NullPointerException
。可能看起来startdate
似乎是空的,但我无法理解背后的原因。
任何人都可以帮我理解吗?
答案 0 :(得分:0)
显然,您有一个字段 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方法,如果没有其他方法,只是在多个构造函数中做一些稍微不同的事情。