Java的 – 最终variables可以初始化在静态初始化块吗?
根据我对Java语言的理解,可以在static initialization block
初始化静态variables。
然而,当我尝试在实践中实现这个( static
variables也是final
)时,我得到了下面屏幕截图中显示的错误。
截图可以直接访问160wpb4.jpg (如果下面的图片是不可思议的小)。
160wpb4.jpg
当然是的: static final
variables可以在一个静态块中初始化, 但是 ….你在这个例子中有隐式GOTO( 如果发生什么事情, try/catch
本质上是一个'GOTO catch' )。
如果抛出一个exception,你的final
variables将不会被初始化。
请注意,静态构造的使用违背了面向对象的教条。 这可能会使您的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...... }