Java言語の私の理解に基づいて、静的変数はstatic initialization block
。
しかし、実際にこれを実装しようとすると(static
であるfinal
変数も)、以下のスクリーンショットに示すエラーが表示されます。
はい、もちろん:static final
変数は静的ブロックで初期化できますbut ....その例では暗黙のGOTOがあります(try/catch
は本質的に' GOTOは、何か悪いことが起こったらキャッチします ')。
例外がスローされた場合、final
変数は初期化されません。
静的構造の使用は、オブジェクト指向の教義に反することに注意してください。テストが複雑になり、デバッグが難しくなる場合があります。
これを行うことはできますが、例外をスローして静的ブロックを終了する必要があります。キャッチされた例外または新しい例外を再スローできます。通常、この例外はRuntimeException
でなければなりません。汎用のException
をキャッチするのではなく、try
ブロック内からスローされる可能性のあるより具体的な例外をキャッチする必要があります。最後に、静的初期化子が例外をスローすると、JVMはクラスの初期化を1回しか試行しないため、その特定の実行中にクラスが使用できなくなります。このクラスを使用しようとすると、NoClassDefFoundError
などの別の例外が発生します。
そのため、イニシャライザは次のように読み取る必要があります。
static {
try {
...
} catch (Exception e) {
e.PrintStackTrace();
throw new InitializationFailedException("Could not init class.", e);
}
}
InitializationFailedException
がカスタム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がヌルであることを監視および処理するコードを作成する必要があります(またはNullPointerExceptions
が出てくることに満足してください)。
これを処理する良い方法があるかどうかはわかりません。
Finallyブロックに宣言を配置できますか?
try {
//load file
} catch(IOException e) {
// horay
} finally {
Host=config.get......
}