【问题标题】:Variable might not have been initialized变量可能尚未初始化
【发布时间】:2012-03-25 12:14:53
【问题描述】:

我在这里,以为我知道 Java,但我收到错误 Variable 'storage' might not have been initialized。这是我的代码:

public class RobbleSet {
    private final Set<Robble> storage; // Error occurs here

    public RobbleSet() {
        storage = new HashSet<Robble>();
    }

    public addRobble(Robble r) {
        storage.add(r); // Error occurs here too
    }
}

storage 在构造函数中被初始化。什么给了?

【问题讨论】:

  • 您可能需要检查以确保这是 only 构造函数。如果你有多个构造函数,那么每个构造函数都需要初始化storage。更好的是,只需写 private final Set&lt;Robble&gt; storage = new HashSet&lt;Robble&gt;(); 即可,您无需将其放入构造函数中。 :-)
  • 我肯定只有一个构造函数。在现场而不是在构造函数中初始化是否有任何技术差异(在字节码/执行级别)?
  • 我刚刚发布了一个答案——我看到您编辑了您的问题以说出同样的话。关于在一个地方与另一个地方初始化之间的技术差异:不是真的。据我了解,差异将从源代码传输到字节码(因为一个版本在 init 方法中而不是在构造函数中),但这不应该有任何 real 效果。

标签: java


【解决方案1】:

storage 被声明为 final,因此错误。 对于最终变量,必须在构造函数中分配值。 addRobble中的错误也是由于相同的原因,您不能在构造函数以外的任何方法中修改最终变量的值。

【讨论】:

  • 嗨,你能提供一些代码示例来提供你的答案吗?这将有助于 OP 和其他人更好地理解您的答案;)
【解决方案2】:

addRobble 没有返回类型,因此静态分析器将其作为构造函数拾取,即使它不称为 RobbleSet。正确的代码如下:

public class RobbleSet {
    private final Set<Robble> storage; // Error occurs here

    public RobbleSet() {
        storage = new HashSet<Robble>();
    }

    public void addRobble(Robble r) {
        storage.add(r); // Error occurs here too
    }
}

【讨论】:

    【解决方案3】:

    一个问题是你没有为addRobble声明返回类型;你需要改变这个:

        public addRobble(Robble r) {
    

    到这里:

        public void addRobble(Robble r) {
    

    我怀疑这是问题——你的编译器认为addRobble是一个错误命名的构造函数,所以抱怨它无法初始化storage——但即使事实证明这不是 问题,这绝对是 问题。

    【讨论】:

    • +1 我也注意到了,但我原以为他会在这种情况下看到不同的错误。
    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 2013-11-24
    • 2016-05-14
    相关资源
    最近更新 更多