2012-04-09 59 views
0

我有最后一个成员的数据最终的变量初始化:确保当一个构造函数抛出异常

public final Foo foo; 
在构造

foo被初始化如下:

foo = new Foo(); 

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

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

但是现在编译器公司mplains foo可能未被初始化,如果Foo的构造函数抛出异常,则为true。但是,如果我把foo = null放在收集括号内,它会抱怨foo可能已经被初始化。

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

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

+0

即使没有try/catch块,我也没有收到编译器的投诉。你是否让你的类的构造函数抛出了Foo引发的异常? – 2012-04-09 19:49:48

回答

7
foo = createFoo(); 

... 


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

我做出是否有意义继续施工的外部对象的,如果内部对象的构造失败无可奉告......

+0

哈。没想到这一点。谢谢! – garbagecollector 2012-04-09 19:34:15

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

在发生异常的情况下,是不是foo_temp在这里未初始化? – 2012-04-09 19:43:47

+0

@TonyEnnis我认为你是对的。 – emory 2012-04-09 19:46:23

+0

嘿,至少有人有足够的关心阅读你的代码;-) – 2012-04-09 19:51:06

0

也许我不理解,但我不要错误。请注意,ConTest的构造函数抛出了Foo引发的异常。这对我来说是最优雅的(回答你的问题。)如果Foo未能初始化,是不是有什么错误?

ConTest.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"); 
     } 
    } 

,这一切编译罚款。

+0

如果ConTest的构造函数抛出一个异常,那么是的,'foo'有些错误。但这并不意味着ConTest必须重新抛出该异常。即使'foo'初始化失败,ConTest仍然可以正常工作。 – garbagecollector 2012-04-09 20:39:06

+0

这对我来说很奇怪。你会在代码中使用很多_if(foo!= null ...)_吗? – 2012-04-09 20:47:15

+0

不是很多,但我不负责整个源代码,所以我必须遵守现有合同。 – garbagecollector 2012-04-09 21:03:16

相关问题