我有一个类有两个构造函数——一个接受Date
对象,另一个尝试基于给定的时间戳字符串创建日期对象。需要注意的是,转换为Date
对象可能会引发异常。我收到"变量时间戳可能尚未初始化"错误。
第一个构造函数:
public Visit(Date timestamp) {
this.timestamp = timestamp;
}
第二个构造函数(产生错误的构造函数):
public Visit(String timestamp) {
try {
this.timestamp = dateFormat.parse(timestamp);
} catch (ParseException ex) {
Logger.getLogger(Visit.class.getName()).log(Level.SEVERE, null, ex);
}
}
我尝试将this.timestamp
的初始化添加到try
的finally
语句中,但这会导致一个错误,即变量可能已经初始化。
如果您愿意在出现异常时使用默认值,您可以执行以下操作:
Date temp = null;
try {
temp = dateFormat.parse(timestamp);
} catch (ParseException ex) {
Logger.getLogger(Visit.class.getName()).log(Level.SEVERE, null, ex);
}
this.timestamp = (temp == null ? <some default Date value> : temp);
如果没有,那么您可以从构造函数中抛出一个异常。通常,如果构造函数的参数无效,则可以重新抛出IllegalArgumentException
。
或者您可以让构造函数"抛出"Exception,例如:
public ToDelete(Date date) throws Exception {
this.date = this.getDate(); //getDate throws the Exception
}
我已经尝试将this.timestamp的初始化添加到try的finally语句中,但这会给出一个错误,即变量可能已经初始化。
这是因为最终成员变量必须在构造函数的所有代码路径中初始化,并且只能初始化一次。避免这种情况的唯一方法是将解析逻辑与赋值解耦。