Java的 – 最终variables可以初始化在静态初始化块吗?

根据我对Java语言的理解,可以在static initialization block初始化静态variables。

然而,当我尝试在实践中实现这个( staticvariables也是final )时,我得到了下面屏幕截图中显示的错误。

截图可以直接访问160wpb4.jpg (如果下面的图片是不可思议的小)。

160wpb4.jpg

当然是的: static finalvariables可以在一个静态块中初始化, 但是 ….你在这个例子中有隐式GOTO( 如果发生什么事情, try/catch本质上是一个'GOTO catch' )。

如果抛出一个exception,你的finalvariables将不会被初始化。

请注意,静态构造的使用违背了面向对象的教条。 这可能会使您的testing复杂化,并使debugging更加困难。

你可以做到这一点,但你需要通过抛出exception退出静态块 – 你可以重新抛出被捕获的exception或新的exception。 通常这个exception必须是一个RuntimeException 。 你真的不应该捕获一个通用的Exception但更具体的exception可能会从你的try块内抛出。 最后,如果一个静态初始化器抛出一个exception,那么它将在特定的运行期间使该类不可用,因为JVM只会尝试初始化你的类。 随后尝试使用此类将导致另一个exception,如NoClassDefFoundError

所以,为了工作,你的初始化器应该像这样读取:

 static { try { ... } catch (Exception e) { e.PrintStackTrace(); throw new InitializationFailedException("Could not init class.", e); } } 

假设InitializationFailedException是一个自定义的RuntimeException ,但可以使用现有的RuntimeException

 public class MyClass { private static final SomeClass myVar; static { Object obj = null; // You could use SomeClass, but I like Object so you can reuse it try { obj = new SomeClass(...); } catch(WhateverException err) { // Possibly nested try-catches here if the first exception is recoverable... // Print an error, log the error, do something with the error throw new ExceptionInInitializerError(err); } finally { myVar = (SomeClass) obj; } } } 

假设没有上游位置可以捕获ExceptionInInitializationError或一般exception,那么程序不应该尝试使用myVar 。 如果这些被捕获并且程序没有结束,那么你需要编码来监视和处理myVar为null(或者满意NullPointerExceptions出来)。

我不确定是否有一个好的方法来处理这个问题。

你能把这个声明放在finally块吗?

 try { //load file } catch(IOException e) { // horay } finally { HOST=config.get...... }