Eclipseが「ローカル変数が初期化されていない可能性があります」というエラーを報告する方法に奇妙な二分法を発見しました。このエラーは通常、変数をtry / catchブロックの外側で宣言し、それをtry / catchブロックの内側で初期化し、try/catchブロックの後で使用すると発生します。
Random r;
try {
r = new AESCounterRNG();
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
r.nextInt(); //Error: The local variable r may not have been initialized
意味あり。変数null
を宣言するときに初期化するか、try / catchブロック内で例外が発生した場合にプログラムの制御フローが次のステートメントに到達しないようにすることで、エラーを回避できます。したがって、変数の初期化が失敗した場合に実際に実行を続行できない場合は、次のようにすることができます。
Random r;
try {
r = new AESCounterRNG();
} catch (GeneralSecurityException e) {
throw new RuntimeException("Initialize secure random number generator failed");
}
r.nextInt(); //No error here
ただし、最近、プログラムのコンソール出力をよりクリーンにするために、System.exit
の代わりにを使用してプログラムを停止しようとしました。RuntimeException
どちらもプログラムの実行を継続できないため、これらは同等だと思いますが、Eclipseが同意しないことを発見しました。
Random r;
try {
r = new AESCounterRNG();
} catch (GeneralSecurityException e) {
System.err.println("Couldn't initialize secure random number generator");
System.exit(1);
}
r.nextInt(); //Error: The local variable r may not have been initialized
r.nextInt()
例外が発生した場合に実行に到達できないのに、Eclipseで「初期化されていません」エラーが発生するのはなぜですか?これはEclipseのバグですか、それともr.nextInt()
呼び出した後も実行を継続できる方法はありSystem.exit
ますか?