我在 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
来停止程序而不是 aRuntimeException
来使我的程序的控制台输出更干净。我认为这些是等效的,因为两者都阻止程序继续执行,但我发现 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
如果发生异常,当执行永远无法到达时,为什么 Eclipse 仍然给我“未初始化”错误r.nextInt()
?这是 Eclipse 中的错误,还是有某种方式可以r.nextInt()
在调用后继续执行System.exit
?