繁体   English   中英

确保在构造函数抛出异常时初始化最终变量

[英]Making sure that a final variable is initialized when a constructor throws an exception

我有一个最终的会员数据:

public final Foo foo;

在构造函数中, foo被初始化如下:

foo = new Foo();

现在,不幸的是,Foo 的构造函数可能会抛出异常:

try {
    foo = new Foo();
} catch (Exception e) {
    e.printStackTrace();
}

但是现在编译器抱怨 foo 可能没有被初始化,如果 Foo 的构造函数抛出异常,这是真的。 但是,如果我将foo = null放在 catch 括号内,它会抱怨 foo 可能已被初始化。

Foo 是我无法修改的第三方库。

那么,处理这个问题最优雅的方法是什么?

foo = createFoo();

...


private static Foo createFoo() {
    try {
        return new Foo();
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

如果内部对象的构造函数失败,我不评论继续构建外部 object 是否有意义......

final Foo foo ;
Foo foo_temp = null ;
try {
    foo_temp = new Foo();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    foo = foo_temp ;
}

也许我不明白,但我没有得到错误。 请注意,ConTest 的构造函数抛出 Foo 引发的异常。 这对我来说是最优雅的(回答你的问题。)如果 Foo 无法初始化,是不是出了什么大问题?

竞赛.java:

   public class ConTest {
       public final Foo foo;
       public ConTest() throws Exception {
           foo = new Foo(3);
       }
   }

Foo.java:

   public class Foo {
       public Foo(int i) throws Exception {
           if (i < 0) throw new Exception("yah");
       }
   }

一切都很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM