【问题标题】:Variable timestamp might not have been initialized变量时间戳可能尚未初始化
【发布时间】:2012-08-25 15:05:12
【问题描述】:

我有一个包含两个构造函数的类——一个接受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 的初始化添加到tryfinally 语句中,但这会给出一个错误,即变量可能已经被初始化。

【问题讨论】:

  • this.timestamp 是最终的。

标签: java


【解决方案1】:

如果您乐于在出现异常时使用默认值,您可以执行以下操作:

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 例如。

【讨论】:

  • 抛出 IllegalArgumentException 效果很好。谢谢。
【解决方案2】:

或者你可以让构造函数“抛出”异常,例如:

 public ToDelete(Date date) throws Exception {
    this.date = this.getDate(); //getDate throws the Exception
}

【讨论】:

    【解决方案3】:

    我尝试将 this.timestamp 的初始化添加到 try 的 finally 语句中,但这会给出一个错误,即变量可能已经被初始化。

    这是因为 final 成员变量必须在构造函数的所有代码路径中初始化,并且只能初始化一次。避免这种情况的唯一方法是将解析逻辑与赋值分离。

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 2015-07-04
      • 1970-01-01
      • 2013-11-24
      相关资源
      最近更新 更多